2016-03-03 100 views
1

按照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! 

有没有一些解决方法可以在这里获得更严格的类型检查?此外,这是一个错误或设计?如果是通过设计,我真的不明白这个设计选择。

回答

6

你没有给定义为AB,或C,但我可以推断他们是什么:

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

打字稿使用结构类型系统(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 
+0

那么,为什么'了'分配给一个字符串?当然,一个字符串与空类没有相同的成员? – Asik

+0

'a'不能分配给字符串。尝试一下。也许你的意思是“为什么字符串可分配给(空类型)A?”,在这种情况下,答案在常见问题解答中得到解答:https://github.com/Microsoft/TypeScript/wiki/FAQ#why-are-all -types-assignable-to-empty-interfaces –

+0

是的,它倒退了。所以如果你想在TypeScript中使用类似标记接口或类的东西,你必须添加一些虚拟字段,或者有更好的方法吗? – Asik

相关问题