Typescript “如何键入”;这";所以它';在子类上调用方法时是否正确?

Typescript “如何键入”;这";所以它';在子类上调用方法时是否正确?,typescript,Typescript,假设我们向内置的对象添加了一个扩展方法: declare global { interface Object { ext<B>(f: (x: this) => B): B; } } 但是,这是因为函数的x参数被推断为对象 我希望它被推断为“this”(String/Number)是.ext()的接收者的类型。对读到这篇文章的人的免责声明:请记住,通常会扩展像Object.prototype这样的本机原型。其他人可能会惊讶地看到ext()。考虑使用一个单独的函数

假设我们向内置的
对象添加了一个扩展方法

declare global {
  interface Object {
    ext<B>(f: (x: this) => B): B;
  }
}
但是,这是因为函数的
x
参数被推断为
对象


我希望它被推断为“
this
”(
String
/
Number
)是
.ext()
的接收者的类型。

对读到这篇文章的人的免责声明:请记住,通常会扩展像
Object.prototype
这样的本机原型。其他人可能会惊讶地看到
ext()。考虑使用一个单独的函数,该对象将对象作为一个额外的参数。好了,免责声明结束


我认为您可能需要使用来让编译器执行此操作。。。给方法a,使编译器和回调函数的参数与该参数的类型相同。推理应该完成剩下的工作:

declare global {
  interface Object {
    ext<B, T>(this: T, f: (x: T) => B): B;
  }
}
我不知道它是否满足您所有的用例,但它似乎在我尝试过的用例中工作。好的,希望能有帮助。祝你好运


对阅读本文的人的免责声明:请记住,通常会扩展本机原型,如
Object.prototype
。其他人可能会惊讶地看到
ext()。考虑使用一个单独的函数,该对象将对象作为一个额外的参数。好了,免责声明结束


我认为您可能需要使用来让编译器执行此操作。。。给方法a,使编译器和回调函数的参数与该参数的类型相同。推理应该完成剩下的工作:

declare global {
  interface Object {
    ext<B, T>(this: T, f: (x: T) => B): B;
  }
}
我不知道它是否满足您所有的用例,但它似乎在我尝试过的用例中工作。好的,希望能有帮助。祝你好运

值得一提的是,使用您自己的类/子类。对于内置,我认为它会变得有点棘手。值得一提的是,对于您自己的类/子类。有了内置的,我觉得会有点棘手。
"x".ext(x => x.toUpperCase()); // okay
(1).ext(x => x + 1) // okay