代码之家  ›  专栏  ›  技术社区  ›  Zev Spitz

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

  •  4
  • Zev Spitz  · 技术社区  · 7 年前

    我正试图构建一个 Date 从 string[] 元素数量可变——有时3个,有时6个。但是,以下Typescript代码无法编译:

    const parts = ['1', '1', '2001'];
    const dte = Date.apply(undefined, parts) as Date;
    

    与:

    “string[]”类型的参数不能分配给“[]”类型的参数。ts(2345)

    可能编译器正在尝试 日期 没有参数的构造函数,这是我不想要的。但即使数组是 number[] ,编译器似乎找不到正确的重载:

    const parts1 = parts.map(x => parseInt(x,10));
    dte = Date.apply(undefined, parts1) as Date;
    

    我如何解决这个问题?

    更具体地说,如何创建 使用值数组作为构造函数的参数?

    4 回复  |  直到 7 年前
        1
  •  7
  •   Karol Majewski    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);
    
        2
  •  0
  •   Dmitriy    7 年前

    问题是Date构造函数需要2到7个参数。由于要映射大小未知的数组,因此需要通过为前2个数组提供默认值来确保确实存在指定数量的arg。下面的代码片段应该可以做到这一点:

    // 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));
    
        3
  •  0
  •   JulianG    7 年前

    你试过这个吗?

    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)
    
        4
  •  0
  •   SC K    7 年前

    不会有任何问题,typescript希望检查所有内容,所以您只需告诉它 我知道我在这里做什么。

    这样做:

    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;
    
    推荐文章