TypeScript函数如何在指定一个泛型时自动推导其余泛型类型
解决方案
TypeScript 目前不支持泛型参数的部分自动推导,当你手动指定任意一个泛型参数后,剩余未指定的泛型参数会直接使用定义时的约束值,不会通过入参自动推导,因此需要用柯里化拆分泛型参数层解决该问题。
修改后的函数定义
export const createStore = < OutputDocument extends Record<string, unknown> >() => < Actions extends Record<string, unknown> >( inputDocument: Record<string, unknown>, actions: () => Actions, ): OutputDocument & Actions => { // 实际业务中该函数会接收输入文档,将其修改为OutputDocument类型 const outputDocument = inputDocument as unknown as OutputDocument return Object.assign({}, outputDocument, actions()) }
调用方式
仅需在手动指定OutputDocument类型后多补一对空括号即可,剩余Actions类型会自动从入参推导:
const test = createStore<{ output: string }>()({ input: 'string here' }, () => ({ update: () => 'test' }))
此时test的类型将完全符合预期,为{ output: string } & { update: () => string }。
内容的提问来源于stack exchange,提问作者Chris Drackett
相关产品推荐
相关产品推荐

