【问题标题】:tsc not checking type equality/assignability correctlytsc 没有正确检查类型相等性/可分配性
【发布时间】:2020-06-22 13:03:10
【问题描述】:

观察

我发现我的代码编辑器(vscode)没有抱怨第 5 行。所以我认为这只是一个打字稿扩展错误。但是我编译的时候(tsc),编译成功了。

class A {}
class B {}
class C {}
type X = A | B;
let x: X = new C();

进一步观察

当我用一些成员字段/方法定义class Aclass B 并将class C 留空时,编译失败。我定义了class Dclass E,其成员字段/方法与class Aclass B中的任何一个相同,然后它编译成功

class A {public a: string;}
class B {public f() {};}
class C {}
class D {public a: string;}
class E {public f() {};}
type X = A | B;
let x: X = new C(); // fail
let y: X = new D(); // success
let z: X = new E(); // success

进一步观察

在上面的例子中,下面给出了falsefalsetrue

console.log(y instanceof A);
console.log(y instanceof B);
console.log(y instanceof D);

问题

tsc 是否检查类型相等性/可分配性 不是用类名 而是用成员签名

(所有测试都使用tsc --version = 3.8.3

【问题讨论】:

    标签: typescript


    【解决方案1】:

    是的,打字稿有structural type system

    TypeScript 中的类型兼容性基于结构子类型。结构类型是一种仅基于其成员关联类型的方法。这与名义打字相反

    更多关于类型兼容性的信息here

    【讨论】:

    • 感谢您的回答。那么WA会添加一些虚拟成员来区分吗?
    • 这取决于用例和区分的原因。你有任何现实生活中的例子吗?
    猜你喜欢
    • 2020-04-08
    • 2012-02-23
    • 2011-04-15
    • 2016-11-12
    • 2017-01-20
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 2011-01-15
    相关资源
    最近更新 更多