Ответ 1
Быстрый ответ
измените это:
export let factory = () => {
return class Foo {}
};
:
export let factory = () : any => {
return class Foo {}
};
Более длинный ответ
Эта ошибка может быть вызвана/принудительной установкой tsconfig.json:
{
"compilerOptions": {
...
"declaration": true // this should be false or omitted
Но это не причина, это просто триггер. Настоящая причина (как обсуждалось здесь Ошибка при экспорте функции, возвращающей класс: Экспортированная переменная имеет или использует личное имя) происходит из компилятора Typescript
когда компилятор TS обнаруживает такой оператор
let factory = () => { ...
он должен начать угадывать, что такое тип возврата, потому что эта информация отсутствует (отметьте : <returnType>
):
let factory = () : <returnType> => { ...
в нашем случае TS быстро узнает, что возвращенный type
легко угадать:
return class Foo {} // this is returned value,
// that could be treated as a return type of the factory method
поэтому, если бы у нас был такой же оператор (это не то же самое, что и исходный оператор вообще, но просто попробуйте использовать его в качестве примера, чтобы выяснить, что происходит), мы можем правильно объявить тип возврата:
export class Foo {} // Foo is exported
export let factory = () : Foo => { // it could be return type of export function
return Foo
};
этот подход будет работать, поскольку класс Foo
экспортируется, т.е. отображается во внешний мир.
Вернемся к нашему делу. Мы хотим вернуть тип, который не экспортируется. И тогда мы ДОЛЖНЫ помочь компилятору TS решить, что такое тип возврата.
Он может быть явным любым:
export let factory = () : any => {
return class Foo {}
};
Но даже лучше было бы иметь какой-то публичный интерфейс
export interface IFoo {}
И затем используйте такой интерфейс как тип возврата:
export let factory = () : IFoo => {
return class Foo implements IFoo {}
};