TypeScript:如何为泛型函数定义字符串类型的参数名?
问题背景
已知可以在对象类型中使用泛型字符串作为键名,示例如下:
type A<B extends string> = { [C in B]?: string } const c: A<"a" | "b"> = { "a": "example", }
现在希望在函数参数中实现类似效果,但尝试的代码无法运行:
type A<B extends string> = ([C in B]?: string) => string const c: A<"a" | "b"> = (a: string) => string
可行解决方案
你写的代码存在语法错误,因为映射类型([C in B])不能直接用在函数参数的位置上。要实现和对象类型一致的泛型键名效果,需要把函数参数定义为映射生成的对象类型,具体写法如下:
方案1:参数为泛型键组成的可选对象(与原对象逻辑完全对应)
// 泛型函数类型:参数是包含B中字符串作为可选键的对象 type A<B extends string> = (params: { [C in B]?: string }) => string // 使用示例 const c: A<"a" | "b"> = (params) => { // 可安全访问params.a或params.b return params?.a ?? params?.b ?? "默认返回值"; }
方案2:参数为单个可选的泛型字符串(若需求是单个参数场景)
如果你的实际需求是让函数接受单个可选的、类型为B的字符串参数,写法更简洁:
type A<B extends string> = (param?: B) => string const c: A<"a" | "b"> = (param) => { return param ?? "默认值"; }
内容的提问来源于stack exchange,提问作者Julian A Avar C
相关产品推荐
相关产品推荐

