Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么动态对象可以有效地设置为typescript中的类_Javascript_Typescript_Instanceof - Fatal编程技术网

Javascript 为什么动态对象可以有效地设置为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

我玩了一点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 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我当然改变了。这就是兴奋对沟通能力的影响:)编辑。