我经常使用这种模式。
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'.
}
}
你碰巧知道怎么做吗?请告诉我。谢谢。 :)
答案 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
希望有所帮助。祝你好运!