Я избавился от ошибки, улучшив последнюю ветку else. Этот ответ помог. Typescript выдает ошибку, потому что простые типы, такие как number
, не имеют конструктора, поэтому instanceof
или <simple type>.constructor.name
не будут работать, а typeof <simple type>
будет.
function* items(
iterable: Map<key, value> | Iterable<value> | Object
): IterableIterator<[key, value]> {
if (iterable instanceof Map) {
for (const entry of iterable.entries()) {
yield entry;
}
}
else if (
// sorted by usage frequency
iterable instanceof Array
|| typeof iterable === 'string'
|| iterable instanceof Set
|| iterable instanceof String
) {
let index = -1;
for (const value of iterable) {
yield [++index, value];
}
}
else if (iterable instanceof Object) {
for (const entry of Object.entries(iterable)) {
yield entry;
}
}
else {
throw new Error(`Can not be used with '${typeof iterable}' type`);
}
}
Пример использования (при компиляции в Javascript):
function* items(iterable) {
if (iterable instanceof Map) {
for (const entry of iterable.entries()) {
yield entry;
}
}
else if (
// sorted by usage frequency
iterable instanceof Array
|| typeof iterable === 'string'
|| iterable instanceof Set
|| iterable instanceof String
) {
let index = -1;
for (const value of iterable) {
yield [++index, value];
}
}
else if (iterable instanceof Object) {
for (const entry of Object.entries(iterable)) {
yield entry;
}
}
else {
throw new Error(`Can not be used with '${typeof iterable}' type`);
}
}
let iterables = [
'hi',
new String('ho'),
[1, true, 'blurp'],
new Set(['foo', 'bar', 'foo']),
{1:'foo', 'bar':null},
new Map([[1,'foo'], ['bar', null]]),
];
for (const iterable of iterables) {
console.log(iterable.constructor.name);
for(const [key, value] of items(iterable)) {
console.log(key, value);
}
}