获取扩展接口的属性

时间:2018-03-23 09:01:33

标签: typescript

我正在尝试在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的类型系统来支持它?

1 个答案:

答案 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