gpt4 book ai didi

函数参数中的TypeScript Array Union Type

转载 作者:行者123 更新时间:2023-12-05 04:24:14 24 4
gpt4 key购买 nike

我有一个联合类型的各种特定长度的数组:

[ number ] | [ number, number ] | [ number, number, number, number ]

如您所见,对于一个元素、两个元素或四个元素的数组都有要求。

我正在尝试创建一个包含具有这些长度之一的函数的对象。我该如何编写类型定义以实现这一点?

TS playground

例子:

const people: {
name: string,
address: Address,
work: (numbers: [ number ] | [ number, number ] | [ number, number, number, number ]) => any
}[] = [
{
name: "Bob",
address: new Address(),
work: function(numbers: [ number ]): number {
// Implementation returning number
}
},
{
name: "Ashley",
address: new Address(),
work: function(numbers: [ number, number, number, number ]): boolean {
// Implementation returning boolean
}
},
{
name: "Michael",
address: new Address(),
work: function(numbers: [ number, number ]): number {
// Implementation returning number
}
},
]

目前,它给我错误:

Error message

类型 '(numbers: [number]) => number' 不可分配给类型 '(numbers: [number] | [number, number] | [number, number, number, number]) => any'。参数类型“numbers”和“numbers”不兼容。输入'[数字] | [数字,数字] | [number, number, number, number]' 不可分配给类型 '[number]'。类型“[number, number]”不可分配给类型“[number]”。源有 2 个元素,但目标只允许 1.ts(2322)

-------- 编辑--------

我应用了评论中的建议,并将所有可能的调用都变成了单独的函数联合,而不是数组联合:

const people: {
name: string,
address: Address,
work: ((numbers: [ number ]) => any) | ((numbers: [ number, number ]) => any) | ((numbers: [ number, number, number, number ]) => any)
}[] = [

现在尝试从此数组调用函数时:

 people[1].work([2, 8, 6, 4])

它现在抛出以下错误:

Type number is not assignable to type never

在 VSCode 中我发现这是为什么:

“'[number] & [number, number] & [number, number, number, number]' 的交集被缩减为 'never',因为属性 'length' 在某些成分中具有冲突类型。”

最佳答案

已更新你需要在这里使用双方差

class Address { }

type Tuple<
N extends number,
Item = number,
Result extends Array<unknown> = [],
> =
(Result['length'] extends N
? Result
: Tuple<N, Item, [...Result, number]>
)


interface WorkFn {
work(numbers: Tuple<1> | Tuple<2> | Tuple<4>): any
}

interface Person extends WorkFn {
name: string,
address: Address,
}

const people: Person[] = [
{
name: "Bob",
address: new Address(),
work(numbers: Tuple<1>) {
const [myNumber] = numbers;

return myNumber * 6
}
},
{
name: "Ashley",
address: new Address(),
work: function (numbers: Tuple<4>): boolean {
const [myNumber, anotherNumber, someNumber, replaceNumber] = numbers;

return myNumber === anotherNumber && someNumber === replaceNumber;
}
},
{
name: "Michael",
address: new Address(),
work: function (numbers: Tuple<2>): number {
const [myNumber, anotherNumber] = numbers;

return myNumber * anotherNumber;
}
},
]

TypeScript playground

Here您可以找到方法类型和箭头函数类型之间的区别以及关于 bivariance

另外,请注意它不是 100% 安全的

关于函数参数中的TypeScript Array Union Type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73554873/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com