如何基于类属性声明Typescript类型?

时间:2019-06-21 11:28:34

标签: typescript

如何基于类属性创建类型? 在此示例中,将说明此想法。当前,这就是我们可以基于类属性创建类型的方法,但是它只能在该类的函数/方法中起作用。

class A
{
   properties = { name: 'John'}

   getProperty(propName: string): any
   {
       const properties = this.properties;
       type propertiesType = typeof properties;

       let validKey: keyof propertiesType = 'name';
       let invalidKey: keyof propertiesType = 'age';

       return properties[propName];
   }
 }

此代码目前可以使用,但不允许我们在类级别上提取propertiesType。如果可能的话,我们可以编写下面的伪代码示例:

// Pseudo Code
class A
{
   properties = { name: 'John'}
   type propertiesType = typeof this.properties;

   getProperty(propName: keyof propertiesType): any
   {
      // compile time check for propName validity.
   }
   ...
 }

所以问题是,有没有一种方法可以基于类属性提取类型并在类级别使用此类型?

2 个答案:

答案 0 :(得分:1)

您可以使用索引类型查询来获取属性的类型(没有实例,就像您在答案版本中所做的那样:

type propertiesType = A['properties']
type availableKeys = keyof A['properties'];
class A {
    properties = { name: 'John' }

    getProperty(propName: availableKeys): any {

    }
}

答案 1 :(得分:0)

经过一番苦苦挣扎,这是我发现的唯一可行的方法。请评估是否发现有任何流程或改进值得您分享。

type availableKeys = keyof typeof a.properties;

class A
{
   properties = { name: 'John' }

   getProperty(propName: availableKeys): any
   {
      type x = typeof A;
      return this.properties[propName];
    }
  }
}
let a = new A();
a.getProperty('test'); // will give compile time error, only 'name' is allowed.