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

Asi*_*sik 1 typescript

根据规范第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)

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

Rya*_*ugh 6

你没有给出定义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)