我现在阅读了TypeScript handbook,在“可选模块加载”部分中,我遇到了如下示例:
declare var require;
import Zip = require('./ZipCodeValidator');
if (needZipValidation) {
require(['./ZipCodeValidator'], (x: typeof Zip) => {
if (x.isAcceptable('...')) { /* ... */ }
});
}
我的问题是从
开始x:typeof Zip
在类似
的示例中是否正确使用x.isAcceptable( '...')
我认为因为x代表“类ZipCodeValidator”,所以你不能直接调用类成员而不先获取类的实例。
我还在Visual Studio中测试了这段代码,IDE显示语句x.isAccetable('...')无效。
作为参考,我从手册中提取了ZipCodeValidator的代码,如下所示:
import validation = require('./Validation');
var numberRegexp = /^[0-9]+$/;
class ZipCodeValidator implements validation.StringValidator {
isAcceptable(s: string) {
return s.length === 5 && numberRegexp.test(s);
}
}
export = ZipCodeValidator;
答案 0 :(得分:0)
你的Zip课程是什么样的?
一般情况下,如果您有一个Zip类型的对象,那么您可以将其称为“
”。例如,这可以正常工作
import Zip = require('./ZipCodeValidator');
Zip.isAcceptable('...');
这确实假设isAcceptable是zip类中的静态函数。否则你需要有一个对象的实例
import Zip = require('./ZipCodeValidator');
x = new Zip();
x.isAcceptable('...');
您的课程确实需要加载'某种程度上'并且你的导入... require告诉我你打开了某种模块加载。
你可以在没有模块加载的情况下完成,但是你需要引用其他文件
/// <reference path="./ZipCodeValidator"/>
如果您这样做,您可以直接拨打其他课程中的代码&#39;。一般来说,我不建议不加载模块。
答案 1 :(得分:0)
在您的示例中,typeof Zip
类型引用Zip(ZipCodeValidator)构造函数,而Zip
类型引用Zip类型的实例。
因此,typeof Zip
调用中的require
类型是正确的,因为这是导入对象x
的正确类型(尽管不需要这样做,因为它是已由import
语句导入 - 但尝试使用x.isAcceptable
是错误的,因为isAcceptable
是Zip的实例的成员,而不是构造函数(换句话说,它不是静态类成员)。
要使isAcceptable
可用作构造函数的成员,需要使用static
关键字(static isAcceptable(s: string) …
)声明它。
否则,您需要执行以下任一操作:
new x().isAcceptable(…)
)。isAcceptable
)的原型访问x.prototype.isAcceptable
。