有一个Date
对象,它可以用number
或string
:实例化
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团队认为,让联合类型与多个重载一起工作并不值得实现(请参阅此处)。他们认为人们应该"永远不要写一系列在联合类型中具有等效表示的重载",但目前DateConstructor
在lib.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
接口,则没有采用该并集类型的重载,有一个采用字符串的重载和一个采用数字的重载。因此,您必须单独测试每种类型。