TypeScript中带有推导和`keyof`的细粒度类型

时间:2018-08-23 04:20:35

标签: typescript typescript3.0

所以我有类型

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覆盖类型是可以的,但是我的尝试没有成功。

1 个答案:

答案 0 :(得分:1)

此语法对我有用:

const fn = <N extends keyof A>(name: N) =>
    ({ [name]: T2 }) as ({ [P in N]: T2 });

请注意,首先出现该类型错误的原因是,如果N设置为非单一类型,则此错误是不正确的。如here所述,将N约束为单例类型的方法会有所帮助。