现在我想拥有一个准确列为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
旨在处理特定数量的操作数,因此我会这样。您甚至可以使用通用构建元组类型:
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]
};