【问题标题】:Extending a class in another file在另一个文件中扩展一个类
【发布时间】:2014-05-13 03:58:25
【问题描述】:

我有一些由工具生成的 TypeScript 代码。我想在另一个文件中扩展这个类。从 0.9.1.1 开始,最好的方法是什么?

我想也许我可以将我的附加函数装订到原型上,但这会产生各种错误(根据编译器的心情而变化)。

例如:

Foo.ts(由工具生成)

module MyModule {
    export class Dog { }
}

Bar.ts

module MyModule {
    function bark(): string {return 'woof';}

    Dog.prototype.bark = bark;
}

【问题讨论】:

  • 我将您的问题解释为您想要类似于 C# 中的部分类的东西:单个类,但具有跨越多个文件的定义。一些属性和方法将在一个文件中定义(由工具生成的文件),而另一些将在另一个文件中定义,但它们是 same 类的成员,而不是子类。这个对吗?如果是这样,我认为在 TypeScript 中没有任何方法可以精确地执行此操作(请参阅typescript.codeplex.com/workitem/933)。
  • 您希望在基类定义之外动态扩展基类。这似乎违背了 TypeScript 的精神,即对 JavaScript 强制执行更强的类型。您想要做的是惯用的 JavaScript,但 TypeScript 是为了避免而发明的。允许类型变形有点违背强类型的原则......

标签: class typescript


【解决方案1】:

您不能在 TypeScript 中的多个文件之间拆分类定义。然而 typescript 理解 JavaScript 是如何工作的,并且可以让你编写 idomatic JavaScript 类就好了:

module MyModule {
     export function Dog(){};
}

module MyModule {
    function bark(): string {return 'woof';}
    Dog.prototype.bark = bark;
}

Try it online

解决这个问题的一种方法是使用继承:

class BigDog extends Dog{
     bark(){}
}

【讨论】:

  • 我宁愿不使用子类。这不是“是”关系。如果没有语言中的抽象类,这样的解决方案会更加成问题,因为它没有明确指出哪个是“真正的”类。
  • @MgSam 现在 TypeScript 中有抽象类。
【解决方案2】:

我以前也遇到过你的问题,但我遇到了一些更深层次的问题。您可以从 basarat 的示例中看到,可以将简单函数添加为原型的扩展,但是当涉及到静态函数或其他静态值时,您可能想要扩展您的(可能是第三方)类,然后 TSC 会发出警告你,在类上没有静态定义这样的方法。

我的解决方法是以下小技巧:

module MyModule {
     export function Dog(){};
}

// in the other file
if (typeof MyModule !== 'undefined'){
    Cast<any>(MyModule.Dog).Create = ()=>{return new Dog();};
}

// where Cast is a hack, for TS to forcefully cast types :)
Cast<T>(element:any):T{ return element; } 

这应该将 MyModule.Dog 转换为任何对象,因此允许附加任何类型的属性、函数。

【讨论】:

    猜你喜欢
    • 2010-10-27
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 2020-02-06
    • 2021-07-24
    • 1970-01-01
    相关资源
    最近更新 更多