可以“typeof Zip”直接调用其成员

时间:2015-12-29 21:03:34

标签: typescript

我现在阅读了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;

2 个答案:

答案 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) …)声明它。

否则,您需要执行以下任一操作:

  1. 首先使用构造函数实例化类型,以便访问成员函数(new x().isAcceptable(…))。
  2. 通过类构造函数(isAcceptable)的原型访问x.prototype.isAcceptable