问答中心分类: TYPESCRIPT在 TypeScript 中获取和设置
0
匿名用户 提问 2月 前

我正在尝试为属性创建 get 和 set 方法:

private _name: string;

Name() {
    get:
    {
        return this._name;
    }
    set:
    {
        this._name = ???;
    }
}

设置值的关键字是什么?

Niels Steenbeek 回复 2月 前

下划线和 PascalCase 与 Typescript 编码指南冲突:github.com/Microsoft/TypeScript/wiki/Coding-guidelines

Niels Steenbeek 回复 2月 前

嗨@NielsSteenbeek – 遵循 TypeScript 贡献者指南以及属性和支持字段,您最终会遇到名称冲突。建议的方法是什么?

Niels Steenbeek 回复 2月 前

也许:typescript private name: string; getName() { get: { return this.name; } set: { this.name = ???; } }

Niels Steenbeek 回复 2月 前

好在那些 Typescript 编码指南很不吸引人。我只会在胁迫下使用它们(例如,我被付钱这样做)。

Niels Steenbeek 回复 2月 前

@NielsSteenbeek:你读过那个文件吗? “这不是 TypeScript 社区的规范性指南”

10 Answers
0
TornadoAli 回答 2月 前

Ezward 已经提供了一个很好的答案,但我注意到其中一条评论询问它是如何使用的。对于像我这样偶然发现这个问题的人,我认为在 Typescript 网站上获得有关 getter 和 setter 的官方文档的链接会很有用,因为这很好地解释了这一点,希望在更改时始终保持最新状态制作,并显示示例用法:
http://www.typescriptlang.org/docs/handbook/classes.html
特别是,对于那些不熟悉它的人,请注意不要将“get”这个词合并到对 getter 的调用中(对于 setter 也是如此):

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' getter。

Adam Plocher 回复 2月 前

如果我想用一个属性替换一个公共类级别的 var,它是一个直接的替换,我可以放置而不用担心它吗?换句话说,如果我对一个访问器和一个设置器进行回归测试,我可以认为它成功了吗?还是在某些情况下它的工作方式与 var 不完全相同,我需要测试所有 100 个使用此 var/prop 的地方?

cham 回复 2月 前

我想知道是否有使用下划线将属性名称与 getter 或 setter 方法区分开来的解决方法。在我正在做的一门课程中,他们说下划线不是首选,但没有给出替代方案。

Robert McKee 回复 2月 前

@cham您不必在此处使用下划线…您可以根据需要调用私有变量 notbar 。

0
Brian Terlson 回答 2月 前

这是一个可以为您指明正确方向的工作示例:

class Foo {
    _name;

    get Name() {
        return this._name;
    }

    set Name(val) {
        this._name = val;
    }
}

JavaScript 中的 getter 和 setter 只是普通的函数。 setter 是一个函数,它接受一个参数,其值为被设置的值。

Drew Noakes 回复 2月 前

需要明确的是,不需要属性、getter 和 setterstatic.

Johannes 回复 2月 前

变量引用仍然是静态的。Foo._name应该替换为this._name

0
k33g_org 回答 2月 前

你可以写这个

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;
    } 

}
MuriloKunze 回复 2月 前

为什么在构造函数中公开?

orad 回复 2月 前

是的,在此代码中的构造函数中不能有 public。public这里定义了重复的成员。

Justin 回复 2月 前

你可以写它,但它不会编译

Raikish 回复 2月 前

可以在 get 和 set 等属性中使用 Pascal Case 吗?你能提供增强这种做法的资源或文档吗?

sudharsan tk 回复 2月 前

它对我不起作用,设置和获取中的大写字母,它无法识别。

0
Willem van der Veen 回答 2月 前

TS 提供了 getter 和 setter,它们允许对象属性更好地控制如何访问(getter)或更新(setter)外部的对象。不是直接访问或更新属性,而是调用代理函数。
例子:

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';
0
Yilmaz 回答 2月 前

根据您展示的示例,您希望传递一个数据对象并通过 get() 获取该对象的属性。为此,您需要使用泛型类型,因为数据对象是泛型的,可以是任何对象。

export class Attributes<T> {
    constructor(private data: T) {}
    get = <K extends keyof T>(key: K): T[K] => {
      return this.data[key];
    };
    set = (update: T): void => {
      //   this is like spread operator. it will take this.data obj and will overwrite with the update obj
      // ins tsconfig.json change target to Es6 to be able to use Object.assign()
      Object.assign(this.data, update);
    };
    getAll(): T {
      return this.data;
    }
  }

&lt;T&gt; 指泛型。让我们初始化一个实例

const myAttributes=new Attributes({name:"something",age:32})

 myAttributes.get("name")="something"

注意这个语法

<K extends keyof T>

为了能够使用它,我们应该注意两件事:
1- in typestring 字符串可以是一个类型。
2- javascript 中的所有对象属性本质上都是字符串。
当我们使用 get() 时,它接收的参数类型是传递给构造函数的对象的属性,并且由于对象属性是字符串并且字符串在打字稿中是允许的类型,我们可以使用它<K extends keyof T>