2015-12-29 1 views
0

Я прочитал машинописи handbook теперь, Дополнительный модуль загрузки секции, я встретил пример, как показано ниже:может «TypeOf Zip» вызвать его член непосредственно

declare var require; 
import Zip = require('./ZipCodeValidator'); 

if (needZipValidation) { 
    require(['./ZipCodeValidator'], (x: typeof Zip) => { 
     if (x.isAcceptable('...')) { /* ... */ } 
    }); 
} 

мой вопрос является с

х : TypeOf Zip

это правильное использование в примере, что, как

x.isAcceptable («...»)

Я думаю, так как х представляет собой „класс 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

В вашем примере тип typeof Zip относится к конструктору Zip (ZipCodeValidator), тогда как тип Zip относится к экземпляру типа Zip.

Таким образом, typeof Zip типа в require вызова является правильным, так что правильный тип для импортируемого объекта x (хотя не должны были бы сделать это, как уже импортирована import заявление) бут попытка использование x.isAcceptable неверно, так как isAcceptable является членом экземпляра Zip, не являющегося членом функции конструктора (другими словами, это не статический член класса).

Для isAcceptable, чтобы быть полезным в качестве члена конструктора, нужно было бы объявить его с помощью ключевого слова static (static isAcceptable(s: string) …).

В противном случае, вам нужно сделать одну из этих вещей:

  1. Instantiate типа с помощью функции конструктора первых для того, чтобы получить доступ к функции члена (new x().isAcceptable(…)).
  2. Доступ к isAcceptable через прототип конструктора классов (x.prototype.isAcceptable).
+0

Спасибо, это близко к тому, что я думаю, поэтому на официальном сайте TS есть что-то неправильно. Ссылка (http://www.typescriptlang.org/Handbook#modules-optional-module-loading-and-other-advanced-loading-scenarios) - это то, о чем я в первую очередь указал. – IcyBrk

+0

Да, этот пример в документации неверен. –

0

что делает ваш Zip класс выглядит?

В общем случае, если у вас есть объект типа Zip, вы можете назвать его членами.

Например, это будет работать нормально

import Zip = require('./ZipCodeValidator'); 

Zip.isAcceptable('...'); 

это предположить isAcceptable статическая функция в вашем зип классе. В противном случае вы должны иметь экземпляр вашего объекта

import Zip = require('./ZipCodeValidator'); 

x = new Zip(); 
x.isAcceptable('...'); 

Ваш класс действительно нужно быть загружен «как-то» и ваш импорт ... требует говорит мне, у вас есть какой-то модуль нагрузки включен.

Вы могли бы сделать с без загрузки модуля, но тогда вам нужно ссылаться на другие файлы

/// <reference path="./ZipCodeValidator"/> 

если вы делаете, что вы можете назвать код в другом классе «непосредственно». В общем, я бы не рекомендовал ходить без загрузки модуля.

Смежные вопросы