typescript 定义多个类型但只有相同类型的Array?

qc6wkl3g  于 2023-03-04  发布在  TypeScript
关注(0)|答案(1)|浏览(163)

我遇到了一个用例,我需要定义一个只有stringnumber的数组,但只能是一种类型。
例如:

let a = [1, 2, 3];
let b = ['a', 'b', 'c'];

// but cannot be
let c = ['a', 1];

1.如何声明这个变量的类型?
我的想法是

let a : Array<number>|Array<string>;

1.如何将纯数字和纯字符串数组转换为数字数组?

let a : Array<number>|Array<string>;

// how to cast a to b : Array<number>?

PS:这是我遇到的情况

function f(arr: Date[] | number[]) {

    if (arr[0] instanceof Date) {
        g(arr[0]);
        g(arr[1]); // compile error in this line
        g(arr[1] as Date); // Do not use any type assertions.eslint@typescript-eslint/consistent-type-assertions
    }
}

function g(e: Date): void {

}

因此如何避免这些错误或警告并获得一个日期数组?

h7appiyu

h7appiyu1#

你可以使用一个类型 predicate 来定义你自己的类型保护。这里我写了一个函数isDateArray来检查给定的值是否是一个日期数组。

function isDateArray(value: unknown): value is Date[] {
    return Array.isArray(value) && value.every((element) => element instanceof Date);
}

function f(arr: Date[] | number[]) {
    if (isDateArray(arr)) {
        arr
//      ^? Date[]
        
        g(arr[0]); // OK
        g(arr[1]); // OK
    }
}

function g(e: Date): void {}

Playground

相关问题