为什么在类型声明中使用类型联合时 TypeScript 会抛出错误?

Why does TypeScript throw error when using type unions in type declarations?

我正在尝试为简单的 npm 包编写类型声明 merge-ranges

我想出了以下几点:

type rangeElement = number | Date;
type range = [rangeElement, rangeElement];

declare module "merge-ranges" {
  declare function mergeRanges(ranges: range[]): range[];
  export default mergeRanges;
}

然而,当使用 Date 进行测试时,范围打字稿会抛出一个错误 Type 'number' is not assignable to type 'Date'.,而当使用数字范围进行测试时,错误是 Type 'Date' is not assignable to type 'number'.

从类型的角度来看,您尝试做的事情并不合理。类型定义:

...(range: [(number | Date), (number | Date)][])...

允许明显错误的元素组合。 [1, new Date()] 例如是这种类型的完全有效值。

您真正需要的是让参数输入 [number, number][][Date, Date][]。并添加 function overloads 以正确输入结果:

declare function mergeRanges(ranges: [number, number][]): [number, number][]
declare function mergeRanges(ranges: [Date, Date][]): [Date, Date][]

playground link