我发现在分配一个类型为union类型的var时缺少intellisense . 这是有道理的 - 编译器不知道你正在分配哪种联合类型(虽然在某些时候它可以推断它何时有足够的信息,但它也不会这样做......) .

很好 - 所以我可以明确地将赋值转换为我想要的类型,并且intellisense返回 . 但这导致了第二个问题 - 由于某种原因,似乎TypeScript将允许将空对象文字转换为任何接口,但只要添加单个属性,对象文字就必须满足整个接口 .

如果有关于此行为的两个直接问题,并且它们位于以下代码示例的注释中 . 我意识到我可以声明更具体类型的测试变量 - 这不是本主题的重点 . 谢谢你的帮助 .

interface ITestOne {
    a: string;
    b?: string;
}

interface ITestTwo {
    c: string;
}

type EitherType = ITestOne | ITestTwo;

var test1: EitherType = {}; // ERROR, no intellisense to help fill out the required properties in the object literal
var test2: EitherType = {} as ITestOne; // ALLOWED - Why is this allowed?
var test3: EitherType = { b: 'blah' } as ITestOne; // ERROR: property a is missing. Why ISN'T this allowed if the line above is allowed?

更新2017-0131

回复我在关于此主题的打字稿项目上打开的错误报告:

什么类型的断言,它告诉编译器“闭嘴”并信任你 . 运营商既表现为向上运营商,也表现为向下运营商 . 唯一的检查是其中一种类型可分配给另一种 .

在上面的例子中,对于test:{a:string,b?:string}可赋值给{}(不需要参数); for test2 {a:string,b?:string}可赋值给{b:string},因为目标b中唯一必需参数的类型匹配 . 对于test3,{a:string,b?:string}都不能分配给{b:string,x:string},因为它缺少x而{b:string,x:string}到{a:string,b?:string因为它缺少一个 .

因此,在转换时,源或目标仅被验证为不是两个完全不相关的类型(即数字和字符串),否则允许分配 . 我的test3案例在TypeScript 1.7中产生了所描述的结果,但现在允许在TypeScript 2.1中使用 .

关于如何在这种情况下获得有意义的智能感知的问题仍然存在 . 但是,我怀疑答案是如果不使用类型保护块就不支持它 .