打字稿选择&lt;&gt;类型失败:类型&#39;&#34; foo&#34;&#39;不能分配给&#39;选择<bar,“foo”=“”>&#39;

时间:2017-06-21 13:58:49

标签: 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...
}

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

setValue("name", "rick");

Typescript(2.3.4)给出以下错误:

error TS2345: Argument of type '"rick"' is not assignable to parameter of type 'Pick<CreditCard, "name" | "year" | "expired">'.

另外,我 not 有一个CreditCard实例可以作为参数传入,所以更改函数以CreditCard作为第三个参数不是可能在我的用例中。

1 个答案:

答案 0 :(得分:6)

Pick<Obj, Props>创建的类型看起来像Obj,只有Props指定的属性,而您的示例是尝试使用它来获取单个属性的类型,而是这样做:CreditCard[KeyType]

您的setValue函数应如下所示:

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

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