我如何根据作为参数提供的键名告诉打字稿什么是返回类型:
type A = string
type B = number
type Data = {
a: A,
b: B
}
const getProp = (data: Data, key: keyof Data) => {
return data[key]
}
const myData: Data = {
a: 'foo',
b: 123
}
// Type 'string | number' is not assignable to type 'string'.
// Type 'number' is not assignable to type 'string'.
^
const result: string = getProp(myData, 'a')
我知道我正在使用道具a
,因此预期的返回类型为字符串。
请问我该如何运作?
playground
答案 0 :(得分:2)
您需要一个通用类型:
const getProp = <K extends keyof Data>(data: Data, key: K): Data[K] => {
return data[key]
}
之所以行之有效,是因为可以在呼叫站点将K
推断为字符串文字类型'a'
(确实扩展了keyof Data
),然后返回的返回类型为{{1} }是Data[K]
,即Data['a']
。