Class 在另一个文件中扩展类

Class 在另一个文件中扩展类,class,typescript,Class,Typescript,我有一些由工具生成的TypeScript代码。我想在另一个文件中扩展这个类。从0.9.1.1开始,最好的方法是什么 我想也许我可以将我的附加函数绑定到原型上,但这会产生各种错误(根据编译器的心情而变化) 例如: Foo.ts(由工具生成) 酒吧 module MyModule { function bark(): string {return 'woof';} Dog.prototype.bark = bark; } 不能在TypeScript中的多个文件之间拆分类定义。但是

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

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

例如:

Foo.ts(由工具生成)

酒吧

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

    Dog.prototype.bark = bark;
}

不能在TypeScript中的多个文件之间拆分类定义。但是,typescript了解JavaScript的工作原理,可以让您很好地编写idomatic JavaScript类:

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

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

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

class BigDog extends Dog{
     bark(){}
}

我以前也遇到过你的问题,但我有一些更深层次的问题。您可以从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(){};
}
//在另一个文件中
if(MyModule的类型!==“未定义”){
Cast(MyModule.Dog).Create=()=>{returnnewdog();};
}
//其中Cast是一种hack,用于TS强制转换类型:)
Cast(元素:any):T{return element;}

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

我将您的问题解释为您需要类似于C#中的分部类的内容:一个类,但具有跨多个文件的定义。有些属性和方法将在一个文件(由工具生成的文件)中定义,有些属性和方法将在另一个文件中定义,但将是同一类的成员,而不是子类的成员。这是正确的吗?如果是这样的话,我认为在TypeScript中没有任何方法可以精确地做到这一点(请参阅)。这似乎与TypeScript的精神背道而驰,TypeScript的精神是对JavaScript强制执行更强的类型。您想要做的是惯用JavaScript,但TypeScript是为了避免而发明的。允许类型变形某种程度上违背了强类型的原则……我宁愿不使用子类,也可能重复。这不是一种“是”的关系。如果语言中没有抽象类,这种解决方案的问题就更大了,因为它没有明确指出哪个是“真正的”类。@MgSam现在TypeScript中有了抽象类。
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; }