打字稿选择<>类型失败:类型'"foo"'的参数不能分配给'Pick <Bar,'foo">'类型的参数

Ric*_*ick 4 typescript typescript2.0

我有一个用例,我认为这对于Typescript的Pick类型是完美的.

这是一个精简的例子:

interface CreditCard {
  name: string;
  year: number;
  expired: boolean;
}

function setValue(key: keyof CreditCard, value: Pick<CreditCard, typeof key>) {
  // do stuff...
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试调用此函数时:

setValue("name", "rick");
Run Code Online (Sandbox Code Playgroud)

Typescript(2.3.4)给出以下错误:

error TS2345: Argument of type '"rick"' is not assignable to parameter of type 'Pick<CreditCard, "name" | "year" | "expired">'.
Run Code Online (Sandbox Code Playgroud)

另外,我没有CreditCard可用作为参数传入的实例,因此CreditCard在我的用例中不可能更改函数以作为第三个参数.

csp*_*ode 6

Pick<Obj, Props>创建一个类似于Obj仅指定属性的类型Props,而您的示例尝试使用它来获取单个属性的类型,而应该像这样:CreditCard[KeyType]

你的setValue函数应如下所示:

function setValue<K extends keyof CreditCard>(key: K, value: CreditCard[K]) {
  // do stuff...
}
Run Code Online (Sandbox Code Playgroud)

您设置了泛型类型K,它是一个或多个键的字符串文字类型CreditCard.然后使用该类型来获取属性的类型CreditCard.调用函数时,类型系统将K尽可能缩小,并使用它来计算value参数的特定类型.

  • 对于任何感兴趣的人来说,这称为_索引访问类型_,也称为_查找类型_。资料来源:[Typescript 2.1 keyof 和查找类型](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-1.html) (2认同)