联合类型的智能感知

时间:2017-01-30 16:45:45

标签: visual-studio typescript

我发现在分配给类型为联合类型的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中使用。

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

0 个答案:

没有答案