typescript - 使用嵌套的泛型参数定义类型别名
问题描述
我希望能够定义一个接受泛型参数的类型(它本身扩展了具有 2 个泛型参数的类型)并使用嵌套的泛型参数定义其约束。
// Boiler plate for example setup:
type NodeCallback<T> = (err?: Error | void, result?: T) => void
type Handler<I, R> = (event: I, callback: NodeCallback<R>) => void
type StrToNumHandler = Handler<string, number>
// I end up having to do this:
type WorkaroundAsyncHandler<T extends Handler<I, R>, I, R> = (event: I) => Promise<R>
type WorkaroundStrToNumHandler = WorkaroundAsyncHandler<StrToNumHandler, string, number>
// I'd like to be able to just write this:
type AsyncHandler<T extends Handler<I, R>> = (event: I) => Promise<R> // This is a compiler error. Not sure how to write this in a valid way.
type AsyncStrToNumHandler = AsyncHandler<StrToNumHandler> // This is the line I'd ultimately like to write
我有编译的解决方法,但是如果我提供 and 的值I
,R
那么提供 没有任何价值Handler
,我希望能够做到这一点。
解决方案
您可以非常接近条件类型和条件类型中的类型推断
type AsyncHandler<T> = T extends Handler<infer I, infer R> ?
(event: I) => Promise<R>
: never
;
type AsyncStrToNumHandler = AsyncHandler<StrToNumHandler>
// inferred as AsyncStrToNumHandler = (event: string) => Promise<number>
缺点是您的类型别名应该提供某种类型,即使T
实际上不是Handler
。通常的解决方案是返回never
类型。但是使用这种别名的代码在接收never
类型时可能会在编译时出现意外行为。
推荐阅读
- shell - 如何以 bash 脚本的形式执行多个查询
- typescript - TypeScript 装饰器不适用于派生类
- python-3.x - 如何通过 RTSP 在同一管道中发送音频文件和视频
- c++ - 为什么列表初始化会导致 Seg 错误?
- android - Android制作一个编辑信息片段
- vba - (Access,VBA)根据位于表单记录源上的表中的复选框值更改表单上按钮的颜色
- node.js - 使用 node.js 将 CSV 文件上传为 MongoDB 文档
- typescript - 给定一个现有键,如何在有序的打字稿字符串枚举中获取下一个或上一个键?
- javascript - 如何将输入从 MainThread 发送到节点 js 中的工作线程(Worker_threads)
- php - laravel 5.8 的分页数据