以下内容不起作用
type Foo = number[] type Bar = string[] function move(x: Foo | Bar) { const v = x.splice(0, 1) x.splice(1, 0, ...v) }
因为显然v是number[] | string[],不能赋值给数字或字符串。我该如何解决这个问题?
v
number[] | string[]
yzuktlbb1#
unknown
由于这是对数组的完全通用的操作(移动一些元素),因此数组的实际类型无关紧要。声明函数接受任何unknown[]或`Array可以工作的数组就足够了:
unknown[]
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
1条答案
按热度按时间yzuktlbb1#
如果类型无关紧要,则使用
unknown
由于这是对数组的完全通用的操作(移动一些元素),因此数组的实际类型无关紧要。声明函数接受任何
unknown[]
或`Array可以工作的数组就足够了:Playground链接
如果类型很重要,请使用泛型
如果还包括类型有意义,请使用泛型并将其约束为仅数组:
Playground链接
这对于指定调用中期望的类型可能很有用,如果它们不匹配,则会引发编译错误:
Playground链接