什么类型描述了一个联合函数参数,其中不同的函数将联合的不同值实现为参数?

问题描述 投票:0回答:1

现在我想拥有一个准确列为2个数字的计算器,一个总计为3个数字,因此我可以实现类型:

type TwoNumbers = [number, number] type ThreeNumbers = [number, number, number] type Sum = (numbersToSum: TwoNumbers | ThreeNumbers) => number

然后,当我以两组calculculator或Threenumbercalculator'类实现这些函数时,我想实现这些功能
const TwoNumberCalculator: Calculator = { sum: (numbersToSum: TwoNumbers) => numbersToSum[0] + numbersToSum[1], } const ThreeNumberCalculator: Calculator = { sum: (numbersToSum: ThreeNumbers) => ..., }

我得到一个无法分配的类型错误。
TwoNumberCalculator:
numbersToSum: TwoNumbers is not assignable to type TwoNumbers | ThreeNumbers7

ThreeNumberCalculator:
numbersToSum: ThreeNumbers is not assignable to type TwoNumbers | ThreeNumbers

我当然可以保留

type Sum = (numbersToSum: number[]) => number
要描述参数,但是具有固定数组大小的尺寸会很好,因为我有时必须直接通过索引访问数组元素。
    

(numbersToSum: TwoNumbers | ThreeNumbers) => number
期望一个可以同时接受
TwoNumbers

ThreeNumbers
的功能,但您提供较窄的类型。有很多方法来重组代码其中之一是使用仿制药。由于
Calculator

旨在处理特定数量的操作数,因此我会这样。您甚至可以使用通用构建元组类型:

typescript types typescript-generics
1个回答
0
投票
Playground

type Calculator<L extends number, T extends NumberTuple<L> = NumberTuple<L>> = {
  sum: Sum<T>,
}

type NumberTuple<L extends number, T extends number[] = []> = T['length'] extends L ? T : NumberTuple<L, [...T, number]>;

type Sum<N extends number[]> = (numbersToSum: N) => number

const TwoNumberCalculator: Calculator<2> = {
  sum: numbersToSum => numbersToSum[0] + numbersToSum[1], // (parameter) numbersToSum: [number, number]
};

const ThreeNumberCalculator: Calculator<3> = {
  sum: numbersToSum => 0, // (parameter) numbersToSum: [number, number, number]
};

    

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.