【发布时间】:2019-09-09 06:41:31
【问题描述】:
我在为 Sanctuary(函数式编程的 js 库)设计类型时遇到问题。我想创建Ord 类型,代表任何具有自然顺序的值。 Ord 是:
- 一些内置的原始类型:
number,string,Date,boolean - 实现所需接口的任何用户类型(
compareTo方法) -
Ords 的数组
为了表达它,我使用了(这对我来说很自然)联合类型(与使重复类型成为可能的轻微变通方法),例如:
type Ord = boolean | Date | number | string | Comparable<any> | OrderedArray
interface OrderedArray extends Array<Ord> {}
(我提到的任何代码都可以在 typescript playground 获得)。
然后,创建类型定义,例如compare 函数,我使用了带有类型约束的泛型类型,即类似(注意它是咖喱):
function compare<T extends Ord>(a: T): (b: T) => number
不幸的是,在使用带有文字参数的这种方法时,例如(compare(2)(3),这是完全有效的代码),打字稿错误,'3' is not assignable to '2'。似乎在提供第一个参数的情况下,typescript 将类型参数缩小到2(文字类型只包含2 值),而它应该只缩小到number。有什么办法可以阻止他这样做吗?或者任何其他工作方法?
【问题讨论】: