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

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

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

Из путей.

//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);

};

Это законный ES6 javascript. Тем не менее, единственное, что я нашел, - это экспорт класса. Это означает, что когда он компилируется в 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, где шаблон становится более заметным.

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,

Другие вопросы по тегам