我正在尝试在TypeScript中编写一个泛型函数,该函数返回一个对象的属性,该函数具有返回属性扩展HasID
接口的附加约束。
我希望能够使用这样的东西:
let obj = {
foo: 123,
bar: {
id: 123
}
};
get(obj, 'foo') // Error
get(obj, 'bar') // Everything is fine
这是我到目前为止所做的:
interface HasID {
id: number;
}
interface HasPropertyWithID<K, T extends HasID> {
K: T
}
function get<
T extends HasID,
K extends keyof O,
O extends HasPropertyWithID<K, T>
>(obj: O, key: K): T {
return obj[key]
}
但是它会给出错误'O[K]' is not assignable to type 'T'
。有没有办法弯曲TypeScript的类型系统来支持它?
答案 0 :(得分:0)
使用映射类型将适当地约束值:
function get<
K extends keyof O,
T extends HasID,
O extends { [P in K]: T }
>(obj: O, key: K): T {
return obj[key]
}
// Usage
let obj = {
foo: 123,
bar: {
id: 123,
ss: ''
}
};
get(obj, 'foo') // Error
get(obj, 'bar') // Everything is fine