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即可,但我的尝试没有成功。

4

1 回答 1

1

这种语法对我有用:

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

请注意,您首先收到该类型错误的原因是,如果N设置为非单例类型,这是不合理的。正如这里提到的,一种限制N为单例类型的方法会有所帮助。

于 2018-08-23T11:12:26.567 回答