我将模块引入现有的typescript项目,以便它可以使用外部模块。当前代码扩展了基本类型,如字符串,无需模块即可正常工作。一旦我引入导入,编译就会失败。
内部模块失败:
/// <reference path='../defs/react.d.ts' />
import React = require("react");
module ExampleModule {
interface String {
StartsWith: (str : string) => boolean;
}
if (typeof String.prototype.StartsWith !== 'function') {
String.prototype.StartsWith = function(str) {
return this.slice(0, str.length) === str;
};
}
export function foo() { return "sdf".StartsWith("s"); }
}
外部模块失败:
/// <reference path='../defs/react.d.ts' />
import React = require("react");
interface String {
StartsWith: (str : string) => boolean;
}
if (typeof String.prototype.StartsWith !== 'function') {
String.prototype.StartsWith = function(str) {
return this.slice(0, str.length) === str;
};
}
module ExampleModule {
export function foo() { return "sdf".StartsWith("s"); }
}
但是如果删除导入,那么它可以正常工作:
interface String {
StartsWith: (str : string) => boolean;
}
if (typeof String.prototype.StartsWith !== 'function') {
String.prototype.StartsWith = function(str) {
return this.slice(0, str.length) === str;
};
}
module ExampleModule {
export function foo() { return "sdf".StartsWith("s"); }
}
此行发生错误:
if (typeof String.prototype.StartsWith !== 'function') {
并阅读:
The property 'StartsWith' does not exist on value of type 'String'
答案 0 :(得分:4)
看起来你打算扩展String
接口,但是为了做到这一点,你必须在同一个公共根中声明你的接口(即String
是全局的,但你的{{1接口属于您声明的模块文件(只要您使用String
,您的文件就会被视为外部模块。)
这就是为什么它可以避免import
语句的原因 - 因为文件不算作模块 - 所以在任何模块之外声明你的import
接口意味着它在全局范围内就像原来的String
界面一样。