我有一个用例,我认为这对于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
作为第三个参数不是可能在我的用例中。
答案 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
参数的特定类型。