将数组作为参数应用于Date构造函数

时间:2018-12-13 06:22:47

标签: typescript

我正在尝试从具有可变数量元素的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

4 个答案:

答案 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;