打字稿:如何一般地获得类成员的类型

时间:2017-06-12 07:28:18

标签: typescript typescript2.0

class Awesome<ObjType extends Object,
     KeyType extends keyof ObjType , 
     MemberType /* is of type obj:ObjType obj[KeyType]*/>{}

如何将MemberType约束为此ObjType

实例成员的类型

1 个答案:

答案 0 :(得分:4)

我认为你在寻找MemberType extends ObjType[KeyType]

  

...键入构造,支持静态验证涉及动态属性名称和由此类动态名称选择的属性的代码...

     

- 来自实施该功能的Pull Request

对于您的代码,它的工作原理如下:

class Awesome<ObjType extends Object,
     KeyType extends keyof ObjType , 
     MemberType extends ObjType[KeyType]> { }

interface A { 
    a: number;
    b: string;
}

// okay:
type A1 = Awesome<A, keyof A, string | number>

// not okay:
type A2 = Awesome<A, keyof A, boolean>

// okay:
type A3 = Awesome<A, 'a', number>
type A4 = Awesome<A, 'b', string>

// not okay:
type A5 = Awesome<A, 'a', boolean>
type A6 = Awesome<A, 'b', Date>

Playground

修改

正如Daniel Rosenwasser所指出的,keyof被称为“关键查询”,ObjType[KeyType]是“索引访问类型”。