我正在尝试从具有可变数量元素的Date
构造string[]
,有时是3,有时是6。但是,以下Typescript代码无法编译:
const parts = ['1', '1', '2001'];
const dte = Date.apply(undefined, parts) as Date;
具有:
'string []'类型的参数不能分配给'[]'类型的参数。ts(2345)
大概是编译器正在尝试不带参数的Date
构造函数,我不希望这样做。但是,即使数组为number[]
,编译器似乎也找不到正确的重载:
const parts1 = parts.map(x => parseInt(x,10));
dte = Date.apply(undefined, parts1) as Date;
我该如何解决?
更具体地说,如何使用值数组作为构造函数的参数来创建Date
?
答案 0 :(得分:7)
首先,请确保使用数字而不是字符串。这就是类型签名所说的。
[1, 1, 2001]
然后,告诉TypeScript您刚刚告诉我们的内容-您的列表不仅是任何数字列表(number[]
),而且还包括3个或更多项目的列表。
type Sequence<T> = [T, T, T, ...T[]];
const parts: Sequence<number> = [1, 1, 2001];
您需要做的就是创建一个new Date
。
const dte = new Date(...parts);
答案 1 :(得分:0)
问题在于Date构造函数期望2到7个参数之间的任何地方。由于您要映射大小未知的数组,因此需要通过为前2个提供默认值来确保确实有指定数量的args。下面的代码片段应该可以解决问题:
// Date constructor can have between 2 and 7 args
type DateArgs =
[number, number, number?, number?, number?, number?, number?];
const parts = ['2000', '10', '10']
const args: DateArgs = [0, 0];
parts.forEach((part, index) => {
args[index] = parseInt(part, 10);
})
console.log(new Date(...args));
答案 2 :(得分:0)
您尝试过吗?
const parts: [number, number, number] = [2001, 1, 1];
const date = new Date(...parts);
console.log(date); // Thu Feb 01 2001 00:00:00 GMT+0000 (Greenwich Mean Time)
答案 3 :(得分:0)
有一些很好的答案,但是如果您确定数组的内容 不会有任何问题,打字稿要检查所有内容,所以您只需要告诉它 我知道我在这里做什么。
执行此操作:
const parts = ['1', '1', '2001'];
const dte = Date.apply(undefined, <any>parts) as Date;
或:
const parts = ['1', '1', '2001'];
// @ts-ignore
const dte = Date.apply(undefined, parts) as Date;