TypeScript中的兼容重载不接受联合类型

时间:2016-05-02 19:53:42

标签: typescript

Date个对象,可以使用numberstring进行实例化:

new Date("...");
new Date(123456);

即使支持这两种类型,联合类型string|number也不是:

if (typeof value === "string" || typeof value === "number") {
    object = new Date(value); // Error.
}
  

类型'string |的参数number'不能分配给'string'类型的参数。类型'number'不能指定为'string'类型。

这背后的原因是什么?我知道我可以建立if ... else链,但我不明白这一点。如果值的类型是两种类型之一,并且这两种类型都被接受,为什么我不能使用它?

2 个答案:

答案 0 :(得分:1)

使联合类型与多个重载一起工作并不是TypeScript团队认为值得实现的东西(See here)。他们认为人们应该反而永远不会编写一系列在工会类型中具有等效表示的重载,但目前这不是{em> lib.d中DateConstructor所做的。 .TS :

interface DateConstructor {
    new (): Date;
    new (value: number): Date;
    new (value: string): Date;
    // ... etc...
}

您可以对其中一种类型进行断言以使其工作:

if (typeof value === "string" || typeof value === "number") {
    object = new Date(value as string);
}

或者为DateConstructor创建一个具有联合类型的新签名:

interface DateConstructor {
    new (value: number | string): Date;
}

实际上他们应该在lib.d.ts ...

中做些什么

答案 1 :(得分:0)

首先,我认为您需要使用instanceof运算符,但我对此并不是100%肯定。其次,因为在一个条件中检查两种类型,该代码块中的值仍被视为联合类型number|string。如果你看一下lib.d.ts中的DateConstructor接口,就没有采用该联合类型的重载,有一个带有字符串的重载和带有数字的重载。因此,您必须单独测试每种类型。