Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.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
强制typescript尊重类类型_Typescript - Fatal编程技术网

强制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??