TypeScript 联合类型需要长度

TypeScript union type requires length

interface IMessage {
  value: string;
  length?: string;   // <-- why is this line necessary?
}

function saySize(message: IMessage|IMessage[]) {
  if (message instanceof Array) {
    return message.length;
  }
}

此代码段可以编译,但需要 IMessage 中的选项 length。如果遗漏,则错误为:

unions.ts(8,24): error TS2339: Property 'length' does not exist on type 'IMessage | IMessage[]'.

我觉得这违反直觉,因为我需要假设 IMessage 可以用作数组类型。是否确实需要添加可选长度,还是我弄错了?

目前没有针对类型保护的 TypeScript 1.4 的未解决问题。类型保护包括 typeofinstanceof.

您使用的检查 (instanceof) 应该会导致 if 块中的类型变窄。那应该意味着不需要您界面上的 length?: string;

您可以在这里提出问题,看看是否可以修复,或者是否有特殊原因对数组进行区别对待。

https://github.com/Microsoft/TypeScript/milestones/TypeScript%201.4

与此同时,您可以使用这种丑陋的类型断言来避免将 属性 添加到您的界面(因为 IMessage 不会有那个 属性)。

return (<IMessage[]><any>message).length;

似乎是一个错误。我在这里报告过:https://github.com/Microsoft/TypeScript/issues/1587 需要注意的一件事是我不会将 interface 与类型保护一起使用,尽管这不是此处错误的来源。

UPDATE 已修复 master : https://github.com/Microsoft/TypeScript/pull/1657 所以应该在 1.4