我可以应用获取价值观的模式吗?类的非静态成员的对象类型?

时间:2018-06-16 00:24:37

标签: javascript typescript

我经常使用这种模式。

const numbers = { a: 1 as 1, b: 2 as 2 },
      number: typeof numbers[keyof typeof numbers] = 1; // type of number is (1 | 2)

但是我无法将它应用到课堂上,所以我提出质疑。

class Class {
    numbers = { a: 1 as 1, b: 2 as 2 };

    method () {
        const number: this['numbers'][keyof this['numbers']] = 1, // Error: Type '1' is not assignable to type 'this["numbers"][keyof this["numbers"]]'.
              number2: typeof this['numbers'][keyof typeof this['numbers']] = 1; // Error: Cannot find name 'this'. 
    }
}

你碰巧知道怎么做吗?请告诉我。谢谢。 :)

1 个答案:

答案 0 :(得分:2)

Polymorphic this并不是您想要使用的。例如,Class的子类可以缩小numbers的类型,然后this['numbers']不一定具有类型为1的属性:< / p>

class Whoops extends Class {
  numbers = {a: null! as never, b: 2 as 2, c: 3 as 3}
}

不要使用this类型,只需明确命名该类:

const number: Class['numbers'][keyof Class['numbers']] = 1; // okay

另外,因为该模式BlahBlahBlah[keyof BlahBlahBlah]是多余的并且使用了很多,所以我倾向于给它一个类型别名:

type ValueOf<T> = T[keyof T];

然后您可以将上述number类型注释更改为:

const number: ValueOf<Class['numbers']> = 1; // okay

希望有所帮助。祝你好运!