是否可以对联合类型进行更严格的类型检查?

时间:2016-03-03 19:39:58

标签: typescript

根据specification section 3.4,这不会编译:

let s: string | number;
s = false; // not a string or a number

所以,从逻辑上讲,给定A,B和C类,我也希望这不会编译,但确实如此:

let a: A | B;
a = new C();
a = "hi";
a = {}; // a can be anything!

是否有一些解决方法可以在此处进行更严格的类型检查?此外,这是一个错误还是设计?如果按照设计,我真的不了解这种设计选择。

1 个答案:

答案 0 :(得分:6)

您没有给出ABC的定义,但我可以推断它们是什么:

class A {}
class B {}
class C {}
let a: A | B;
a = new C();
a = "hi";
a = {}; // a can be anything!

TypeScript使用结构类型系统(read the 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