如何在TypeScript中显式键入泛型函数?

邓肯·卢克

问题

我具有以下通用函数类型:

type Validator<TInput, TOutput extends TInput> = (value: TInput) => Validated<TOutput>;

现在,我想实现这种类型,所以我做了以下工作:

const isNotNull: Validator<T | null, T> = <T>(value: T | null): Validated<T> => {
    // Implementation here
};

这是行不通的,因为T在定义之前就使用了它。

我知道我可以推断出的类型,isNotNull但我想明确地将其声明Validator为约束。我该怎么做呢?


语境

Validator类型将用作函数参数,如下所示:

function validate<TInput, TOutput>(
    value: TInput,
    validator: Validator<TInput, TOutput>
): TOutput {}

当然,实际上不需要此功能。实际情况更为复杂,但我已将其简化到最低限度。

这就是为什么Validator必须通用的原因。

贾卡尔兹

TypeScript缺乏将isNotNull函数描述为的必要表达能力Validator如果TypeScript具有microsoft / TypeScript#17574中所述的任意“通用值” ,则人们可能会说出类似以下内容:

declare const isNotNull: forall T, Validator<T | null, T>; // not valid TS, error

但是目前尚无办法。(有关更多信息,在此问题的答案中,我将继续介绍TypeScript中的泛型。)

如果没有以编程方式执行此操作的能力,则可能需要手动进行操作:

declare const isNotNull: <T>(value: T | null) => Validated<T>;

幸运的是,虽然,而编译器不能表达的是isNotNull有关Validator,它可以识别它。所以,你还可以通过isNotNullvalidate()没有问题:

validate(Math.random() < 0.5 ? 123 : null, isNotNull);
// function validate<number | null, number>(
//   value: number | null, validator: Validator<number | null, number>
// ): number

编译器认为isNotNull可以将其视为Validator<number | null, number>


我可以想象的唯一另一种方法是代表一个泛型函数,当您使用类型参数调用它时,该函数将返回 ,如下所示:Validator<T | null, T>T

const getIsNotNull = <T>(): Validator<T | null, T> => isNotNull;
validate(Math.random() < 0.5 ? "hey" : null, getIsNotNull<"hey">());

这使您能够说“isNotNullValidator”有关,但代价是无用的无参数咖喱函数。我更喜欢直接使用validatewith isNotNull


操场上的代码链接

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Swift中,返回相同类型的函数的泛型函数使我“无法显式专门化泛型函数”

如何在TypeScript的泛型函数中使用判别式?

如何在 Typescript 中定义泛型函数类型;两种相似的方式?

Typescript 如何限制泛型函数中的子类?

显式特化一个泛型函数是 swift

在TypeScript中显式键入通用函数参数与隐式键入之间有什么区别?

如何在Kotlin中创建泛型函数

如何在TS和TypeORM中创建泛型函数?

如何在Swift中调用歧义泛型函数?

我如何在泛型函数中引用“ typeof T”?

如何在TypeScript中显式定义泛型返回类的返回类型?

如何键入一个泛型函数?

如何在scala中实现一个泛型函数,该泛型函数可以添加和求和参数?

java中的泛型函数如何实现?

Swift 泛型 - 无法显式专门化泛型函数

如何使用 const 箭头函数在 TypeScript 中实例化泛型函数类型?

泛型函数的Typescript ReturnType

TypeScript泛型函数的类型

是TypeScript枚举泛型函数

Typescript泛型函数重载

如何在TypeScript的泛型函数中使用有界类型?

在TypeScript中的泛型函数中推断映射类型

如何将对象传递给TypeScript中的泛型函数

使用闭包时无法显式专门化泛型函数

Swift-无法显式专门化泛型函数

为什么不允许显式地专门化泛型函数?

如何在R中的泛型函数中在aes中指定任意数量的变量?

分配给 TypeScript 中的泛型函数参数

泛型函数中的 Typescript 范围无法按预期缩小