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链,但我不认为这有什么意义。如果一个值的类型是两种类型中的一种,并且这两种类型都被接受,为什么我不能使用它?

TypeScript团队认为,让联合类型与多个重载一起工作并不值得实现(请参阅此处)。他们认为人们应该"永远不要写一系列在联合类型中具有等效表示的重载",但目前DateConstructorlib.dts:中并不是这样做的

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中应该做的。。。

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

最新更新