【发布时间】: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根本没有被使用,您应该摆脱它;它只会让你感到困惑。名为MyClass的type 本质上是一个类似{a: number; readonly b: number}的接口。它确实 not 的意思是“肯定由MyClass构造函数创建的东西”。请记住,TypeScript 编译为 JavaScript,主要是通过删除类型注释,所以这变成了class MyClass { ... }然后var myObject = { a: 10 }。你不能指望myObject有一个b属性,因为你没有给它一个。 -
“我不能使用新的
MyClass()构造函数,我需要像上面一样声明我的对象”。为什么?如果您想要建议做什么,我们需要一个用例。如果你只是想知道为什么上面的代码不起作用(除了你提到裸a而不是this.a的错字)那么我可以将上面的cmets扩展为一个答案,但我不知道实际上将有助于您面临的任何潜在问题。
标签: typescript