所以我有类型
type A = {
a?: T1,
b?: T1
}
我有一个功能
const fn: <N extends keyof A>(name: N) => ({ [P in N]: T2 })
= name => ({ [name]: T2 });
使用繁重的泛型表达式的想法是静态地推断结果的类型。它有效,我写了fn('a')
,编译器将其类型推断为<"a">(name: "a") => { a: T2; }
,除了函数本身说Type '{ [x: string]: T2; }' is not assignable to type '{ [P in N]: T2 }'.
问题:有没有一种方法可以为函数fn
编写类型,同时保持原义良好的静态类型推断,却避免了讨厌的类型错误?
仅使用as
覆盖类型是可以的,但是我的尝试没有成功。
答案 0 :(得分:1)
此语法对我有用:
const fn = <N extends keyof A>(name: N) =>
({ [name]: T2 }) as ({ [P in N]: T2 });
请注意,首先出现该类型错误的原因是,如果N
设置为非单一类型,则此错误是不正确的。如here所述,将N
约束为单例类型的方法会有所帮助。