打字稿版本:3.9.2
期望是声明一个接口约束,该接口约束仅允许类上的非功能成员键
type NonFunctionKeys<T extends {}> = {
[K in keyof T]-?: T[K] extends Function ? never : K
}[keyof T];
class MyClass {
someKey: boolean = true;
set<T extends keyof this>(key:T, value: this[T]) {
}
setValue<T extends NonFunctionKeys<this>>(key:T, value: this[T]) {
}
foo() {
// is ok
this.set('someKey', true);
// is ok
(this as MyClass).setValue('someKey', true);
// next line will report error
// 2345: Argument of type '"childValue"' is not assignable to parameter of type 'this[keyof this] extends Function ? never : keyof this'.
this.setValue('someKey', true);
}
}
// and that is ok
const c = new MyClass();
c.set('someKey', true)
c.setValue('someKey', true)
打字稿无法识别this
吗?但是,IDE可以给出正确的提示,并且使用属性时类型判断是正确的。
PS:附加说明,这里的场景相对简单,但实际上它涉及继承,集合的值可能是超类的成员,或者如果继承了该类,则子类将具有其他属性,所以我不能写一个特定的MyClass而不是this
打字稿版本:3.9.2期望声明一个接口约束,该约束仅允许类类型NonFunctionKeys上的非功能成员键
setValue
,则类型system也不知道。因此,您应该使用手动检查和强制转换来覆盖所有可能的情况。