typescript 如何对数组类型的并集执行操作?

nwsw7zdq  于 2023-05-30  发布在  TypeScript
关注(0)|答案(1)|浏览(202)

以下内容不起作用

type Foo = number[]
type Bar = string[]

function move(x: Foo | Bar) {
    const v = x.splice(0, 1)
    x.splice(1, 0, ...v)
}

因为显然vnumber[] | string[],不能赋值给数字或字符串。我该如何解决这个问题?

yzuktlbb

yzuktlbb1#

如果类型无关紧要,则使用unknown

由于这是对数组的完全通用的操作(移动一些元素),因此数组的实际类型无关紧要。声明函数接受任何unknown[]或`Array可以工作的数组就足够了:

type Foo = number[]
type Bar = string[]

function move(x: unknown[]) {
    const v = x.splice(0, 1)
    x.splice(1, 0, ...v)
}

declare const arr: Foo | Bar;
move(arr); //OK

Playground链接

如果类型很重要,请使用泛型

如果还包括类型有意义,请使用泛型并将其约束为仅数组:

type Foo = number[]
type Bar = string[]

function move<T extends Array<unknown>>(x: T) {
    const v = x.splice(0, 1)
    x.splice(1, 0, ...v)
}

declare const arr: Foo | Bar;
move(arr); //OK

Playground链接
这对于指定调用中期望的类型可能很有用,如果它们不匹配,则会引发编译错误:

move<string[] | number[]>(arr);             // OK
move<string[] | number[] | boolean[]>(arr); // OK
move<string[] | boolean[]>(arr);            // error
move<string[]>(arr);                        // error

Playground链接

相关问题