У меня есть класс TS, который имеет следующий асинхронный генератор, определенный как общедоступный метод доступа:
/**
* Provides a way to iterate through the templates, one
* channel at a time.
*/
public async *iterator() {
let output: IDictionary = {};
const substitutions = this.isListDataset
? this._substitutions
: [this._substitutions];
yield this._channels.map(async function*(channel) {
const fn = await this.compileTemplate(this._topic, channel);
const output: ITemplateChannel = {
channel,
templates: []
};
this._substitutions.map((data: IDictionary) => {
output.templates.push(fn(data));
});
yield output;
});
}
Редактор ( vs-code ) достаточно доволен этим объявлением, но если я запускаю ts-node
поверх определения класса, он жалуется:
Неожиданный токен *
Хорошо, я знаю, что для поддержки библиотек необходимо настроить асинхронизаторы и генераторы, но мой tsconfig.json
:
{
"compilerOptions": {
"declaration": true,
"module": "commonjs",
"target": "esnext",
"lib": ["esnext.asynciterable", "esnext", "es2015.generator"],
"moduleResolution": "node",
"sourceMap": true,
"noImplicitAny": true,
"outDir": "./lib",
"removeComments": true,
"typeRoots": ["./node_modules/@types"]
},
"include": ["src/**/*"],
"exclude": ["node_modules", "**/*-spec.ts"]
}
Чего мне не хватает?
Примечание: я замечаю, что если я изменю yield output
на yield* output
, как мне кажется, должно быть ... против кода указывает, что:
Хорошо, теперь я читаю об этой зависимости, но мне неясно, как бы я ее реализовал. Моя неудачная попытка состояла в том, чтобы добавить этот метод в класс:
public [Symbol.asyncIterator]() {
return Symbol.asyncIterator || Symbol.for("Symbol.asyncIterator");
}
но как-то угадать, мне нужно сопоставить его с функцией map
? Это правильно? Или, может быть, сам метод iterator
? Возможно оба? Confused.