打字稿:课堂上无法识别

时间:2020-05-20 13:07:27

标签: typescript class this

打字稿版本: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

1 个答案:

答案 0 :(得分:0)

我认为您想要的是不可能的。如果要在直到运行时才知道您拥有的对象是基类还是派生类的地方调用df.groupby(),则类型system也不知道。因此,您应该使用手动运行时检查和强制转换来覆盖所有可能的情况,如下所示:

DAYS = 4

df = pd.DataFrame({
    'ID': ['a', 'a', 'a', 'b', 'b', 'b'],
    'TIME': [
        np.datetime64('2020-01-01'),
        np.datetime64('2020-01-02'),
        np.datetime64('2020-01-09'),
        np.datetime64('2020-01-04'),
        np.datetime64('2020-01-06'),
        np.datetime64('2020-01-20')
    ]
})

df = df.sort_values(by=['ID', 'TIME'], ascending=True)

我不确定为什么需要进行强制强制转换,因为我希望type guards会加入。但是,进行手动强制转换并不麻烦,因为您只是检查了对象的类型您需要强制转换。