强制typescript尊重类类型
我有以下代码:强制typescript尊重类类型,typescript,Typescript,我有以下代码: class A { public var1: string = 'var1'; } class B { public var1: string = 'var1'; public var2: string = 'var2'; } const instance: A = new B(); console.log(instance instanceof A); 我不理解为什么typescript编译器可以使用实例:A=new B(),因为B不扩展A。如果A
class A {
public var1: string = 'var1';
}
class B {
public var1: string = 'var1';
public var2: string = 'var2';
}
const instance: A = new B();
console.log(instance instanceof A);
我不理解为什么typescript编译器可以使用实例:A=new B()
,因为B不扩展A。如果A和B是接口,我理解,因为接口不会一直执行,但对于类,我不理解
最后一行返回“false”,这就是A不是B的证明
有什么办法吗?编译器选项?带泛型的代码
关于。当您执行
const instance:A=new B()
时,typescript没有向您显示任何错误的原因是因为typescript使用结构类型,因此基本上,如果结构/形状彼此一致,typescript对此没有问题
例如,如果我们有这样的东西
A类{
foo():布尔值{return true}
}
B类{
foo():布尔值{return true}
}
常数条:A=新的B()
typescript编译器由于结构的原因将上述内容视为相同的内容,但一旦更改了结构,编译器就会对其进行标记
AA级{
foo():布尔值{return true}
}
BB类{
foo():字符串{返回“true”}
}
const foobar:AA=新的BB()
您将从tsc中看到此类错误,类型“BB”不可分配给类型“AA”。“foo()”返回的类型在这些类型之间不兼容。类型“string”不能分配给类型“boolean”
回到您的示例中,B
具有A
的精确结构,因为public var1:string
在B
和A
中都存在,因此B
可以分配给A
,但如果您将其反过来翻转
const实例:B=newa()
编译器将标记代码,因为A
不完全符合B
的结构,因为public var2:string
出现在B
中,而不是A
中
在C++、java和其他使用标称类型的语言中,代码的类型将被编译器标记。
<代码> b>代码>不是<代码> A/<代码>的实例,它仅共享一个共同的属性<代码> VAR1。你必须从中派生,这样他们就有了继承关系。是的,我知道,但仅限于接口:(。没有办法强迫Typescript拒绝将B赋值到A??