Javascript 为什么动态对象可以有效地设置为typescript中的类
我玩了一点typescript,发现:Javascript 为什么动态对象可以有效地设置为typescript中的类,javascript,typescript,instanceof,Javascript,Typescript,Instanceof,我玩了一点typescript,发现: class Greeter { e: number; p: boolean = true; } const xxx = new Greeter(); // true console.log(xxx instanceof Greeter); const xxx2: Greeter = { e: 1, p: true }; // <--- 1. why is this valid? console.log(xxx2 instanceof Gr
class Greeter {
e: number;
p: boolean = true;
}
const xxx = new Greeter(); // true
console.log(xxx instanceof Greeter);
const xxx2: Greeter = { e: 1, p: true }; // <--- 1. why is this valid?
console.log(xxx2 instanceof Greeter); // false
const xxx3: Greeter = Object.setPrototypeOf({ e2: 1 }, Greeter.prototype); // <-- 2. no warning?
console.log(xxx2 instanceof Greeter); // true
类迎宾员{
e:数字;
p:布尔=真;
}
const xxx=新迎宾员();//真的
console.log(接待员的xxx实例);
常量xxx2:Greeter={e:1,p:true};// 因为typescript只执行编译时检查
如果您使用下面的链接并粘贴代码并获取JavaScript
const xxx2: Greeter = { e: 1, p: true };
converts to -->
var xxx2 = { e: 1, p: true };
它只是一个对象,对类Greeter
为什么在typescript中,将动态对象指定给类对象而不是真正的类是有效的。这似乎不是真正的课堂
TypeScript是一种结构语言,而不是一种名义语言。这意味着要检查结构,并且可以使用任何兼容类型。一旦你开始依赖这种语言特性,名义上的打字就会让你发疯
这在未来会有所改善吗
这是无法改进的!结构类型:)
但我认为正确的答案是“不——这是故意的”
constxxx3:Greeter=Object.setPrototypeOf({e2:1},Greeter.prototype)代码>似乎是黑客。但是这些类型没有干净的Typescript函数。这应该更干净,有更好的检查功能吗
这个需要一点解构
第一部分是TypeScript中有一个动态类型:any
。任何类型为any
的东西都像变形器。它可以是任何类型
只要您希望编译器不碍事并允许您使用动态类型,就可以使用any
。(动态就像在“类型可以动态更改”中一样,我注意到您将对象文字描述为动态——但我在这里谈论的是正式的动态类型)
调用Object.setPrototypeOf(…)
时,它返回这些特殊的动态类型之一,类型为any
这意味着,当您将其分配给具有类型Greeter
的变量时,它是允许的,因为您具有any
类型
尽管这可能会阻碍您尝试做一些事情,但我相信您想要实现的目标是可能的——因此,请随意询问如何实现您需要做的任何事情,我相信我们会想出一种方法来帮助您从您的团队中走到这里
@Fenton的正确做法是值得称赞的福音主义,因为TypeScript支持结构化打字。然而,当人们发现自己对禁果的想法很有趣时,确实有一些解决办法:
我建议给Greeter
a,这样您就不能再给它分配对象文字了。私有类成员似乎是标称类型的“标准”类型脚本解决方案
例如:
class Greeter {
private _nominal = true; // add something like this
e: number;
p: boolean = true;
}
const xxx = new Greeter();
const xxx2: Greeter = { e: 1, p: true }; // error, missing _nominal
const xxx3: Greeter = { e: 1, p: true, _nominal: true }; // error, _nominal is private
这对你有用吗?这至少会增加射中自己脚的难度,尽管如果你真的尝试,你会成功:
// don't do this
const xxx4: Greeter = function() { return "ha ha fooled you";} as any as Greeter;
希望有帮助;祝你好运 因为typescript使用的typescript只是一个编译时检查,它对实际Javascript代码中的这些类型并没有任何魔力。顺便说一句,第一个错误是由报告的,所以流可能更适合您的需要。TypeScript使用结构类型,并且对象的创建方式(特别是,它是不是用类构造函数完成的-这就是instanceof
check的意义所在)不是TypeScript类型系统的一部分,它不太可能改变。@JLRishe我当然改变了。这就是兴奋对沟通能力的影响:)编辑。