2016-05-03 35 views
1

假设我想扩大String.prototype,所以我有这个在内线/ string.ts例如:如何添加文件与打字稿延伸原型

interface String { 
    contains(sub: string): boolean; 
} 

String.prototype.contains = function (sub:string):boolean { 
    if (sub === "") { 
     return false; 
    } 
    return (this.indexOf(sub) !== -1); 
}; 

当我做import * as string from 'ext/string.ts'它失败,此错误:

error TS2306: File 'ext/string.ts' is not a module

这是假设的行为,我没有写出口。 但是,我如何告诉打字稿,我想扩展String.prototype呢?

+0

老实说,你应该真的考虑不扩展这样的内置类型。当一些未来的ES版本出现它自己的'contains'本地实现时,你的代码将覆盖它并且可能比本地代码慢。请参阅http://stackoverflow.com/q/14034180/215552。 –

+0

那么,当这个本地实现出来时,我将删除我的导入。 – truedrog

回答

3

您只需要运行该文件而不导入任何东西。你可以做到这一点与此代码:

import "./ext/string"; 

但是,如果你的string.ts文件包含的任何import语句,那么你就需要拿出接口,并把它放在一个定义文件(.d.ts)。您需要使用外部模块执行此操作,以便编译器知道它需要与全局范围中的String接口合并。例如:

// customTypings/string.d.ts 
interface String { 
    contains(sub: string): boolean; 
} 

// ext/string.ts 
String.prototype.contains = function(sub:string): boolean { 
    if (sub === "") { 
     return false; 
    } 
    return (this.indexOf(sub) !== -1); 
}; 

// main.ts 
import "./ext/string"; 

"some string".contains("t"); // true