typescript - 解构由另一个泛型制成的泛型类型
问题描述
抱歉,如果问题标题含糊不清。不知道如何最好地描述这一点
假设我有这个通用接口
interface IPaginatedResponse<T> {
results: T[],
page: number,
count: number
}
我有这个具体的类型
type PaginatedUsers = IPaginatedResponse<User>
现在我想创建一个函数,它接受任何type
具体类型的IPaginatedResponse
// Invalid syntax
const myFn = <IPaginatedResponse<T>>() => {
...
// Do something with T
}
这样我就可以捕捉到打字错误
myFn<PaginatedUsers>() // OK
myFn<User>() // Fails
以上是伪代码。
解决方案
如果你的函数需要任何IPaginatedResponse
,你会希望你的函数需要<T extends IPaginatedResponse<any>>
。要访问内部类型,您可以使用该infer
键创建一个通用帮助器来提取您正在分页的任何内容的类型:
type GetPaginatedType<T extends IPaginatedResponse<any>> = T extends IPaginatedResponse<infer R> ? R : never;
然后,您可以使用该助手来获取函数中的类型(或将其添加到您的 return 语句中)。
type User = "user"
interface IPaginatedResponse<T> {
results: T[],
page: number,
count: number
}
type PaginatedUsers = IPaginatedResponse<User>
type GetPaginatedType<T> = T extends IPaginatedResponse<infer R> ? R : never;
// this works
const user: GetPaginatedType<PaginatedUsers> = "user";
// this doesn't
const notUser: GetPaginatedType<PaginatedUsers> = "notuser";
const myFn = <T extends IPaginatedResponse<any>>() => {
type MyInternalType = GetPaginatedType<T>;
}
myFn<PaginatedUsers>();
// this correctly errors
myFn<User>();
推荐阅读
- android - 当我们只有一个片段时处理`BackPressed`
- python - 使用 Flask REST API 将三个参数传递给 MySQL
- javascript - 全局样式不会覆盖阴影 dom 样式
- java - 为什么我可以为 Android AIDE 中的最终变量重新分配新值?
- javascript - 生产版本太大
- visual-studio-code - 我无法安装 Visual Studio Code
- css - NPM 引导程序和其他带有 Visual Studio 代码的程序
- julia - Julia typeof 的令人费解的结果
- ios - 顺利更新应用内 Apple 订阅定价
- javascript - 将新项目添加到两个不同的 ID