typescript:班级无法识别

问题描述 投票:0回答:1

打字稿版本: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上的非功能成员键= {[T中的K] -...

typescript class this
1个回答
0
投票
我认为您想要的是不可能的。如果要从直到运行时才知道您所拥有的对象是基类还是派生类的地方调用setValue,则类型system也不知道。因此,您应该使用手动检查和强制转换来覆盖所有可能的情况。
© www.soinside.com 2019 - 2024. All rights reserved.