Я пытаюсь создать получить и установить метод для свойства:
private _name: string;
Name() {
get:
{
return this._name;
}
set:
{
this._name = ???;
}
}
Что ключевое слово, чтобы установить значение?
Я пытаюсь создать получить и установить метод для свойства:
private _name: string;
Name() {
get:
{
return this._name;
}
set:
{
this._name = ???;
}
}
Что ключевое слово, чтобы установить значение?
Машинопись использует геттер / сеттер синтаксис, который, как ActionScript3.
class foo {
private _bar:boolean = false;
get bar():boolean {
return this._bar;
}
set bar(theBar:boolean) {
this._bar = theBar;
}
}
Это будет производить этот Javascript, используя функцию ECMAScript 5 Object.defineProperty ().
var foo = (function () {
function foo() {
this._bar = false;
}
Object.defineProperty(foo.prototype, "bar", {
get: function () {
return this._bar;
},
set: function (theBar) {
this._bar = theBar;
},
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
}
Однако для того, чтобы использовать его на всех, вы должны убедиться, что цели машинописи компилятора ECMAScript5. Если вы работаете в строке компилятор командной строки, используйте --target флаг, как это;
TSC --target ES5
Если вы используете Visual Studio, вы должны отредактировать файл проекта , чтобы добавить флаг к конфигурации для инструмента TypeScriptCompile сборки. Вы можете видеть , что здесь :
Как @DanFromGermany предполагает ниже, если ваш просто читать и писать локальное свойство, как foo.bar = верно, то с сеттер и геттер пара является излишеством. Вы всегда можете добавить их позже, если вам нужно что-то делать, как лесозаготовки, когда свойство для чтения или записи.
Ezward уже дал хороший ответ, но я заметил, что один из комментариев, спрашивает, как она используется. Для таких людей, как я, кто наткнуться на этот вопрос, я подумал, что было бы полезно иметь ссылку на официальную документацию по добытчиками и сеттеров на сайте машинопись, как объясняет это хорошо, мы надеемся всегда оставаться в курсе, как изменения сделал, и показывает пример использования:
http://www.typescriptlang.org/docs/handbook/classes.html
В частности, для тех, кто не знаком с этим, обратите внимание, что вы не включать слово «получить» в призыв к геттер (и аналогично для наладчиков):
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» будет называться.
Вот рабочий пример, который должен направить вас в правильном направлении:
class Foo {
_name;
get Name() {
return this._name;
}
set Name(val) {
this._name = val;
}
}
Получатели и сеттеры в JavaScript просто нормальные функции. Сеттер это функция, которая принимает параметр, значение которого значение установлено.
Это очень похоже на создание общих методов, просто поместить ключевое слово зарезервированное 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;
}
Вы можете написать это
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;
}
}
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';
Я думаю , что я , наверное , могу понять , почему это так запутано. В вашем примере, мы хотели методы получения и установки для _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создать геттер и сеттер для yourCarTiresCount( неtiresCount ).Геттер:
function() {
return this.tiresCount ;
}
и сеттер:
function(count) {
alert('You shouldn't change car tire count');
}
Значение, каждый раз , когда мы делаем new Car().yourCarTiresCount, добытчик работает. И для каждого new Car().yourCarTiresCount('7')инкубационных работает.
tireCount.Если вы работаете с машинописью модулями и пытаетесь добавить поглотитель, который экспортируется, вы можете сделать что-то вроде этого:
// 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"