根据规范第3.4节,这不编译:
let s: string | number;
s = false; // not a string or a number
Run Code Online (Sandbox Code Playgroud)
所以,从逻辑上讲,给定A,B和C类,我也希望这不会编译,但它确实:
let a: A | B;
a = new C();
a = "hi";
a = {}; // a can be anything!
Run Code Online (Sandbox Code Playgroud)
是否有一些解决方法可以在这里进行更严格的类型检查?此外,这是一个错误还是设计?如果是设计,我真的不明白这个设计选择.
你没有给出定义A,B或者C,但我可以推断他们是什么:
class A {}
class B {}
class C {}
let a: A | B;
a = new C();
a = "hi";
a = {}; // a can be anything!
Run Code Online (Sandbox Code Playgroud)
TypeScript使用结构类型系统(阅读FAQ),这些空类是可以互换的.
来自FAQ:
没有成员的类型可以用任何类型替换.通常,您永远不应该发现自己声明没有属性的接口.
但是,如果您向类添加成员,就像在现实生活中一样,您会收到错误:
class A { a: number }
class B { b: string }
class C { c: boolean }
let a: A | B;
a = new C(); // error
a = "hi"; // error
a = {}; // error
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
52 次 |
| 最近记录: |