【问题标题】:How to create an object in Typescript avoiding to initialize GET properties?如何在 Typescript 中创建对象以避免初始化 GET 属性?
【发布时间】:2020-05-05 11:47:17
【问题描述】:

如果声明一个类

class MyClass {
   a: number;
   get b(): number { return this.a * 2 };
}

我想知道为什么当我初始化“MyClass”类型的对象时,即使它只是只读(获取)属性,也需要道具“b”

示例代码:

var myObject: MyClass = { a: 10 };

所以这将引发打字稿错误:

类型“{ a: number;”中缺少属性“b” }' 但在“MyClass”类型中是必需的。

【问题讨论】:

  • Readonly 不会影响它需要在对象中显示为受界面约束的事实。有明显的差异,obj.hasOwnProperty 测试给出了差异结果。
  • 当你声明一个MyClass类型的变量时,初始化它的正常方法是使用var myObject: MyClass = new MyClass()。想解释一下你为什么选择不这样做吗?
  • 我不能使用新的 MyClass() 构造函数,我需要像上面一样声明我的对象
  • 如果您不能使用new MyClass(),那么您的class 根本没有被使用,您应该摆脱它;它只会让你感到困惑。名为MyClasstype 本质上是一个类似{a: number; readonly b: number} 的接口。它确实 not 的意思是“肯定由MyClass 构造函数创建的东西”。请记住,TypeScript 编译为 JavaScript,主要是通过删除类型注释,所以这变成了 class MyClass { ... } 然后 var myObject = { a: 10 }。你不能指望myObject 有一个b 属性,因为你没有给它一个。
  • “我不能使用新的MyClass() 构造函数,我需要像上面一样声明我的对象”。为什么?如果您想要建议做什么,我们需要一个用例。如果你只是想知道为什么上面的代码不起作用(除了你提到裸a而不是this.a的错字)那么我可以将上面的cmets扩展为一个答案,但我不知道实际上将有助于您面临的任何潜在问题。

标签: typescript


【解决方案1】:

你不能像对象一样创建类,你需要用new调用构造函数

class MyClass {
   get b(): number { return this.a * 2 };
   constructor(public a: number) { }
}

var myObject: MyClass = new MyClass(10);

现在您可以访问ab 属性

console.log(myObject.a, myObject.b);

更新

当你从 json/interface 创建类时,你也可以这样做

interface IMyInterface {
  a: number
}

class MyClass implements IMyInterface {
  a: number;
  get b(): number { return this.a * 2 };
  constructor(json: IMyInterface) {
    this.a = json.a;
  }
}

const myObject = new MyClass({a: 10});

或者如果你想自动初始化从接口到类的所有成员

constructor(json: IMyInterface) {
  Object.keys(json).forEach(key => {
    this[key] = json[key];
  });
}

【讨论】:

  • 我只是添加了更多示例,也许它会满足您的需求
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-08
  • 1970-01-01
  • 2016-12-27
  • 2022-10-06
  • 1970-01-01
  • 2021-01-31
  • 1970-01-01
相关资源
最近更新 更多