Typescript:用'this'获取自定义界面的类型?

Posted

技术标签:

【中文标题】Typescript:用\'this\'获取自定义界面的类型?【英文标题】:Typescript: Get the type of the custom interface with 'this'?Typescript:用'this'获取自定义界面的类型? 【发布时间】:2020-09-01 11:24:09 【问题描述】:

如果我返回一个“自定义”类型的接口并使用 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】:

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

【讨论】:

我想知道为什么多态 this 只评估调用该方法的对象的类型。表现?还是一些我没有看到的正确性问题? @jcalz 我认为这将是一个性能陷阱。使每个调用站点成为通用推理站点可能会降低性能。再说一次,多态this 的使用频率如何?可能不会很多。可能是一个有趣的 GH 讨论主题,尽管在这一点上它只是一个学术讨论,因为这将是一个突破性的变化。 但是如果我想返回一个新类型的 X 怎么办?我只能自己退货 您的意思是要省略其中的属性?检查这个答案:***.com/questions/56255212/…

以上是关于Typescript:用'this'获取自定义界面的类型?的主要内容,如果未能解决你的问题,请参考以下文章

具有自定义类型的TypeScript clone自我实例

FineReport中如何自定义登录界面

Typescript中的类

TypeScript:继承类中静态方法的自引用返回类型

获取一个文件的名称方法 - 自定义界面 - Microsoft Visual Studio 2010 [关闭]

自定义Hooks函数获取窗口大小