Я пытаюсь создать метод get и set для свойства:
private _name: string;
Name() {
get:
{
return this._name;
}
set:
{
this._name = ???;
}
}
Какое ключевое слово задает значение?
Я пытаюсь создать метод get и set для свойства:
private _name: string;
Name() {
get:
{
return this._name;
}
set:
{
this._name = ???;
}
}
Какое ключевое слово задает значение?
TypeScript использует синтаксис getter/setter, который похож на ActionScript3.
class foo {
private _bar: boolean = false;
get bar(): boolean {
return this._bar;
}
set bar(value: boolean) {
this._bar = value;
}
}
Это создаст этот JavaScript с использованием функции Object.defineProperty() ECMAScript 5.
var foo = (function () {
function foo() {
this._bar = false;
}
Object.defineProperty(foo.prototype, "bar", {
get: function () {
return this._bar;
},
set: function (value) {
this._bar = value;
},
enumerable: true,
configurable: true
});
return foo;
})();
Так что использовать его,
var myFoo = new foo();
if(myFoo.bar) { // calls the getter
myFoo.bar = false; // calls the setter and passes false
}
Однако, чтобы использовать его вообще, вы должны убедиться, что компилятор TypeScript нацелен на ECMAScript5. Если вы используете компилятор командной строки, используйте флаг --target, например так:
tsc --target ES5
Если вы используете Visual Studio, вы должны отредактировать файл проекта, чтобы добавить флаг в конфигурацию для инструмента сборки TypeScriptCompile. Вы можете видеть это здесь:
Как подсказывает @DanFromGermany ниже, если вы просто читаете и пишете локальное свойство, например, foo.bar = true, то наличие пары сеттеров и геттеров является излишним. Вы всегда можете добавить их позже, если вам нужно что-то сделать, например, войти в систему, когда свойство будет прочитано или записано.
Эзвард уже дал хороший ответ, но я заметил, что один из комментариев спрашивает, как он используется. Для таких людей, как я, которые сталкиваются с этим вопросом, я подумал, что было бы полезно иметь ссылку на официальную документацию по получателям и установщикам на веб-сайте Typescript, поскольку это хорошо объясняет это, и мы надеемся, что они всегда будут в курсе происходящих изменений. сделал, и показывает пример использования:
http://www.typescriptlang.org/docs/handbook/classes.html
В частности, для тех, кто не знаком с ним, обратите внимание, что вы не включаете слово "get" в вызов метода получения (и аналогично для методов установки):
var myBar = myFoo.getBar(); // wrong
var myBar = myFoo.get('bar'); // wrong
Вы должны просто сделать это:
var myBar = myFoo.bar; // correct (get)
myFoo.bar = true; // correct (set) (false is correct too obviously!)
учитывая класс как:
class foo {
private _bar:boolean = false;
get bar():boolean {
return this._bar;
}
set bar(theBar:boolean) {
this._bar = theBar;
}
}
тогда будет вызван метод 'bar' для частного свойства _bar.
Вот рабочий пример, который должен указать вам в правильном направлении:
class Foo {
_name;
get Name() {
return this._name;
}
set Name(val) {
this._name = val;
}
}
Getters и seters в JavaScript - это обычные функции. Setter - это функция, которая принимает параметр, значение которого задано.
Вы можете написать это
class Human {
private firstName : string;
private lastName : string;
constructor (
public FirstName?:string,
public LastName?:string) {
}
get FirstName() : string {
console.log("Get FirstName : ", this.firstName);
return this.firstName;
}
set FirstName(value : string) {
console.log("Set FirstName : ", value);
this.firstName = value;
}
get LastName() : string {
console.log("Get LastName : ", this.lastName);
return this.lastName;
}
set LastName(value : string) {
console.log("Set LastName : ", value);
this.lastName = value;
}
}
Он очень похож на создание общих методов, просто поместите ключевое слово зарезервированное get
или set
в начале.
class Name{
private _name: string;
getMethod(): string{
return this._name;
}
setMethod(value: string){
this._name = value
}
get getMethod1(): string{
return this._name;
}
set setMethod1(value: string){
this._name = value
}
}
class HelloWorld {
public static main(){
let test = new Name();
test.setMethod('test.getMethod() --- need ()');
console.log(test.getMethod());
test.setMethod1 = 'test.getMethod1 --- no need (), and used = for set ';
console.log(test.getMethod1);
}
}
HelloWorld.main();
В этом случае вы можете пропустить тип возврата в get getMethod1() {
get getMethod1() {
return this._name;
}
Думаю, я, наверное, понимаю, почему это так запутанно. В вашем примере нам нужны геттеры и сеттеры для _name
. Но мы достигаем этого, создавая геттеры и сеттеры для несвязанной переменной класса Name
.
Рассмотрим это:
class Car{
private tiresCount = 4;
get yourCarTiresCount(){
return this.tiresCount ;
}
set yourCarTiresCount(count) {
alert('You shouldn't change car tire count')
}
}
Выше код делает следующее:
get
и set
создать getter и setter для yourCarTiresCount
(не для tiresCount
).Геттер:
function() {
return this.tiresCount ;
}
а установщик:
function(count) {
alert('You shouldn't change car tire count');
}
Значение, каждый раз, когда мы делаем new Car().yourCarTiresCount
, выполняется getter. И для каждого new Car().yourCarTiresCount('7')
запускает сеттер.
tireCount
.TS предлагает методы получения и установки, которые позволяют свойствам объекта иметь больший контроль над тем, как к ним получают доступ (средство получения) или обновляют (средство установки) вне объекта. Вместо прямого доступа или обновления свойства вызывается прокси-функция.
Пример:
class Person {
constructor(name: string) {
this._name = name;
}
private _name: string;
get name() {
return this._name;
}
// first checks the length of the name and then updates the name.
set name(name: string) {
if (name.length > 10) {
throw new Error("Name has a max length of 10");
}
this._name = name;
}
doStuff () {
this._name = 'foofooooooofoooo';
}
}
const person = new Person('Willem');
// doesn't throw error, setter function not called within the object method when this._name is changed
person.doStuff();
// throws error because setter is called and name is longer than 10 characters
person.name = 'barbarbarbarbarbar';
Если вы работаете с модулями TypeScript и пытаетесь добавить экспортируемый метод получения, вы можете сделать что-то вроде этого:
// dataStore.ts
export const myData: string = undefined; // just for typing support
let _myData: string; // for memoizing the getter results
Object.defineProperty(this, "myData", {
get: (): string => {
if (_myData === undefined) {
_myData = "my data"; // pretend this took a long time
}
return _myData;
},
});
Затем в другом файле у вас есть:
import * as dataStore from "./dataStore"
console.log(dataStore.myData); // "my data"