Типовой скрипт блокирует шаблон узла / модуля фабрики: ошибка TS4060

При использовании синтаксиса модуля ES6 для экспорта фабричной функции, которая возвращает экземпляр класса, Typescript выдает следующую ошибку:

ошибка TS4060: возвращаемый тип экспортируемой функции имеет или использует частное имя «Пути».

Из paths.ts:

//Class scoped behind the export
class Paths {

    rootDir: string;

    constructor(rootDir: string) {

        this.rootDir = rootDir;

    };


};

//Factory function: returns instances of Paths
export default function getPaths(rootDir:string){ 

    return new Paths(rootDir);

};

Этот законный javascript ES6. Однако единственное, что я нашел, - это экспортировать класс. Это означает, что когда он скомпилирован в ES6, класс экспортируется, что противоречит цели его определения в модуле. например:

//Class now exported
export class Paths {

    rootDir: string;

    constructor(rootDir: string) {

        this.rootDir = rootDir;

    };


};

//Factory function: returns instances of Paths
export default function getPaths(rootDir:string){ 

    return new Paths(rootDir);

};

Я что-то упускаю? Мне кажется, что этот шаблон должен поддерживаться машинописным текстом, особенно в компиляции ES6, где шаблон становится более заметным.


person Michael Price    schedule 28.07.2015    source источник


Ответы (1)


Это ошибка, только если вы пытаетесь автоматически создать файл объявления, потому что TypeScript не может передать в этот файл ничего, что могло бы воспроизвести форму вашего модуля со 100% точностью.

Если вы хотите, чтобы компилятор создавал файл объявления, вам необходимо указать тип, который вы можете использовать для типа возвращаемого значения getPaths. Вы можете использовать встроенный тип:

export default function getPaths(rootDir:string): { rootDir: string; } { 
  return new Paths(rootDir);
};

Или определите интерфейс:

class Paths implements PathShape {
    rootDir: string;
    constructor(rootDir: string) {
        this.rootDir = rootDir;
    }
}
export interface PathShape {
    rootDir:string;
}
export default function getPaths(rootDir:string): PathShape { 
  return new Paths(rootDir);
}

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

person Ryan Cavanaugh    schedule 28.07.2015
comment
Большое спасибо, что ты классный! Если бы флаг --declaration был установлен в значение true. - person Michael Price; 28.07.2015