打字稿:使用“ this”获取自定义界面的类型?

时间:2020-05-15 15:15:21

标签: typescript types interface

如果我返回接口的“自定义”类型并且使用typeof,那么我会得到原始类型(我理解为什么,我读了它),但是我可以得到自定义类型?

如果我有以下内容:

interface X{
   A:()=>Omit<typeof this, "A">,
   B:()=>Omit<typeof this, "B">,
   C:()=>Omit<typeof this, "C">,
}

let X : X = {...}

如果要实现以下目的:

即1: X.A()。B()。C()

即2: X.C()。A()。B()

但不是: X.A()。B()。A()(目前可能)

1 个答案:

答案 0 :(得分:3)

Typescript确实具有多态this类型,因此您可以编写以下接口:

interface X{
   A:()=>Omit<this, "A">,
   B:()=>Omit<this, "B">,
   C:()=>Omit<this, "C">,
}

但是,这不会做您想要的事情,因为创建接口时,this类型是绑定的,而不是基于调用该函数的对象的类型。

我们可以使用函数的this参数和泛型类型参数来捕获调用函数的对象的类型。这将按您期望的那样工作:

interface X{
   A:<T>(this: T)=>Omit<T, "A">,
   B:<T>(this: T)=>Omit<T, "B">,
   C:<T>(this: T)=>Omit<T, "C">,
}

let X: X = null!

X.A().B().C()
X.C().A().B()
X.A().B().A() // err

Playground Link