【发布时间】:2020-06-28 21:01:10
【问题描述】:
我正在研究接受两个泛型类型参数的函数。其中之一是Object 类型,另一个是扩展keyof 传递对象类型的字符串。我需要以某种方式确定提供的Object 必须包含第二个参数中提供的键,并且它的值也应该是指定的类型。
我尝试过这样的事情:
const someFn = <
T extends {[key: string]: number | null},
K extends keyof T
>(data: T[], dataField: K) => {
// expecting data values to be (number | null)[] for further purposes
const dataValues = data.map(datum => datum[dataField]);
}
然而,上面的代码只有在传递的对象中的所有键都是number | null时才有效
type WorkingType = { value: number | null }
const workingArray = [{value: 1}, {value: null}]
someFn<WorkingType, "value">(workingArray, "value") // this works just fine
但是如果对象包含不同类型的字段我得到错误:
type FailingType = { value: number | null, sthElse: string }
const workingArray = [{value: 1, sthElse: ""}, {value: null, sthElse}]
//. Property 'sthElse' is incompatible with index signature.
// Type 'string' is not assignable to type 'number | null'
someFn<FailingType, "value">(workingArray, "value")
所以我需要做的是以某种方式提供信息,即只有作为K 提供的密钥需要是number | null 我尝试了类似的方法:
const someFn<
T extends { [key: T]: number | null },
K extends keyof T
>(data: T[], dataKey: K) => {/* ... */}
但这似乎是 TS 不允许的,我得到了An index signature parameter type must be either 'string' or 'number'。有没有可能达到我的目标的方法?
【问题讨论】:
标签: typescript typescript-generics