TypeScript:将this多态化并推断通用函数参数

时间:2019-11-19 14:48:06

标签: typescript function generics this type-inference

我想从传递给函数的s=df.notnull().iloc[:,::-1].idxmax(1) df['num1']=df.lookup(df.index,s) df['check']=s.str.strip('ID') s=pd.wide_to_long(df,'ID',['Node','num1','check'],j='drop').dropna().reset_index() s=s.loc[s.check!=s.drop,['ID','num1','Node']] s Out[459]: ID num1 Node 0 1.0 3.0 YYZ 1 2.0 3.0 YYZ 3 4.0 7.0 DFW 4 5.0 7.0 DFW 5 6.0 7.0 DFW 7 20.0 21.0 DEN 9 100.0 106.0 BOS 10 101.0 106.0 BOS 11 102.0 106.0 BOS 12 103.0 106.0 BOS 13 104.0 106.0 BOS 14 105.0 106.0 BOS 关键字推断当前类的类型。由于某种原因,当我将this作为参数传递给函数时,TypeScript推断类型参数T为this而不是当前的类类型。

下面有一个示例我正在尝试做。我希望thisB类都具有类型为C的{​​{1}},但是传递时C类中的fieldnumber field作为参数。手动指定类型时,一切正常(GenericArguments<this>类示例),但是从this推断类型不会给出我想要的结果。

B

我是否需要一些其他关键字来强制TypeScript使用当前类类型而不是多态this?还是有其他方法可以实现这一目标?

1 个答案:

答案 0 :(得分:0)

this与类的类型不同。它具有特殊类型,即多态this类型。多态this类型表示当前类的类型,无论当前类的类型如何,从外部将其视为。例如,这可行:

class A {
    getThis() { return this; }
    getA(): A { return this; }
}

class B extends A {
    method() { }
}
var b = new B();
b.getThis().method(); // ok since polymorphic this is seen as B from the outside 
b.getA().method(); // err since we are accessing on A

Playground Link

在类内部,这具有不幸的副作用,即this类型必须表现为未解析的类型参数(当前类为extends的一个参数)。这是由于this的最终类型确实尚未完全知道。

由于多态this类型的行为类似于未解析的类型参数,因此typescript在条件类型中对其的处理方式非常有限。 Typescript通常不会解析仍包含未解析类型参数的条件类型。

从类外部,field的类型将被正确解析,因为多态this被解析为我们访问field的任何类型。如果something的类型被派生类缩小(可能的话),我们甚至可能会感到惊讶:

class C extends A<number> {
    field = test(this); // <-- field has a type: GenericArgument<this> 
}
new C().field // is number
class D extends C {
    something!: 1
}
new D().field // is of type number literal type 1

Playground Link

使用字段编号明确的解决方法可能是最简单的方法。