TypeScript 模块扩充 - 将完整实例引用为“this”而不是 subproperty

TypeScript Module Augmentation - Reference to Full Instance as 'this' instead of subproperty

提问人:3x071c 提问时间:3/19/2021 最后编辑:fortunee3x071c 更新时间:3/19/2021 访问量:104

问:

我想通过在属性下添加我自己的实用程序函数来扩展某个库中的类。(用 TypeScript 编写,使用模块扩充util)

当我这样调用我的方法时: ,它们不会接收完整的 ,而只接收我们已经知道的属性。someClassInstance.util.doSomething()someClassInstanceutil

但是,这些函数在调用时需要每个实例的值。SomeClass

有没有办法接收上限范围()而不是作为?someClassInstancesomeClassInstance.utilthis

我知道将实例作为参数传递给函数会更容易实现,但这会使使用我的方法不那么好,因为您实际上会重复自己(包含实例两次)someClassInstance.util.doSomething(someClassInstance)

import * as exported from './[SAME_FILE]';
import { SomeClass } from 'SomeLibrary';

declare module 'SomeLibrary' {
    interface SomeClass {
        util: typeof exported;
    }
}

SomeClass.prototype.util = exported;

// Does not work, expects an instance of SomeClass, 
// but can only receive SomeClass.util
export async function doSomething(this: SomeClass) {
    // do something with `this` (= someClassInstance)
}

示例实现

TypeScript 模块 这个

评论

0赞 jcalz 3/19/2021
我很想在这里看到一个更充实的最小可重现示例,尤其是可以在像 TypeScript Playground 这样的独立 IDE 中运行的示例。由于 TypeScript 只是编译为 JavaScript,我想知道您将如何在 JavaScript 中编写它?这似乎不太可能真正出现在原型上,因为它需要知道您访问的实例。utilSomeClassSomeClassutil
0赞 jcalz 3/19/2021
符合您的需求吗?这太可怕了;我能想到的获得此类行为的唯一方法是修改您导入的构造函数。如果它对你有用,我可能会把它写成一个带有巨大警告的答案。否则,我倾向于认为你所要求的要么是不可能的,要么是非常不可取的。
0赞 3x071c 3/19/2021
@jcalz 是的,这个问题不是特定于打字稿的,它似乎是扩展原型的限制。我可以更改代码片段以使其更通用/可重现,但我担心我首先要做的是太多的努力。
0赞 3x071c 3/19/2021
@jcalz 从技术上讲,这确实解决了问题,尽管它非常丑陋,我已经放弃了,只是将实例作为参数传递......感谢您花时间做这件事,你能把它作为答案发布,以便我可以将其标记为解决方案吗?

答: 暂无答案