TypeScript:扩展现有JavaScript对象

TypeScript:扩展现有JavaScript对象,javascript,typescript,Javascript,Typescript,我有一个来自某个库的纯JavaScript对象(我们称之为O),其接口位于环境名称空间中,例如: declare namespace N { interface IO { // properties... } } 我需要创建一个TypeScript类,它将扩展这个JavaScript对象。扩展它的机制是由库提供的,因此我不能使用本机TS继承,但我需要访问我正在扩展的这个JS对象的所有属性。我尝试声明一个实现此接口的类并对其进行扩展: declare class

我有一个来自某个库的纯JavaScript对象(我们称之为O),其接口位于环境名称空间中,例如:

declare namespace N {
    interface IO {
        // properties...
    }
}
我需要创建一个TypeScript类,它将扩展这个JavaScript对象。扩展它的机制是由库提供的,因此我不能使用本机TS继承,但我需要访问我正在扩展的这个JS对象的所有属性。我尝试声明一个实现此接口的类并对其进行扩展:

declare class DummyO implements N.IO {
    // copy-paste everything from N.IO
}

class MyRealClass extends DummyO {
}
现在我可以访问所有属性,但也有两个问题:

  • 我不得不复制粘贴整个界面,这不太实际
  • TypeScript没有为Dummio创建任何定义(这是好的),但同时尝试使用其本机机制对其进行扩展(这是坏的,因为Dummio实际上并不存在)

  • 所以问题是——如何解决这个问题?如何创建一个TS类,有效地扩展这个本机对象?或者,也许有另一种方法可以让TS相信,我真的在不费吹灰之力的情况下继承了O?

    我所知道的唯一可行的解决方案就是将接口复制粘贴到类中:

    declare namespace N {
        interface IO {
            // example properties:
            a: number;
            f(): number;
        }
    }
    
    
    class MyRealClass implements N.IO {
        // copy IO
        a: number;
        f: () => number;
    
        // add "real" members later...
    }
    

    这并不漂亮,但这就是库中自定义继承解决方案的好处。

    为什么不直接实现
    MyRealClass
    N.IO?N.IO已经完全由JavaScript对象(O)实现。TS是否允许在没有实际实现的情况下复制粘贴N.IO?如果N.IO是一个接口,它怎么可能是一个实现?我可能遗漏了一些东西,但这似乎很好。我不确定DummyO的额外价值是什么。接口已经由真实的JS对象实现,我希望在TS中扩展它,但我没有TS类。这就是问题所在。对于大多数用例来说,这似乎是错误的。答案根本不包括对外部JS对象的任何引用。正如问题所述,外部引用和继承由外部库处理。但这意味着typescript中没有包含某些代码。也许这就是为什么必须复制属性,因为如果代码被覆盖,属性将被正确继承。你能提供一些示例代码吗?我想你可能误解了这个问题。我不是在评论这个问题,而是回答显然是错误的。请分享一些示例代码好吗?