可迭代 getter 的语法?

Mat*_*rný 5 getter generator typescript

我可以声明 getter,其行为类似于函数生成器吗?

我的尝试

class Foo {
    * Test1(): IterableIterator<string> { // Works, but not a getter...
        yield "Hello!"; 
    }

    * get Test2(): IterableIterator<string> { // Syntax error
        yield "Hello!"; 
    }

    get * Test3(): IterableIterator<string> { // Syntax error
        yield "Hello!"; 
    }

    get Test4(): IterableIterator<string> { // Works, but ugly syntax...
        return function* (): IterableIterator<string> {
            yield "Hello!";
        }();
    }
}
Run Code Online (Sandbox Code Playgroud)

例如在 C# 中,这是完全有效的......

class Foo
{
    IEnumerable<string> Test
    {
        get
        {
            yield return "Hello!";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Est*_*ask 6

TypeScript 或 JavaScript 中没有这样的语法。getter 应该返回一个迭代器:

class Foo {
    private * _bar() {
        yield "Hello!"; 
    }

    get bar(): IterableIterator<string> {
        return this._bar();
    }
}
Run Code Online (Sandbox Code Playgroud)

这可以通过装饰器来解决,但由于装饰器不能很好地支持类突变,因此应手动处理正确的类型:

function get<T>(getter: keyof T) {
    return (target: any, method: string, descriptor?: any) => {
        Object.defineProperty(target, getter, {
            configurable: true,
            enumerable: false,
            get() {
                return this[method]();
            }
        });
    }; 
}

interface Foo {
    bar: IterableIterator<string>;
}
class Foo {
    @get<Foo>('bar')
    private * _bar() {
        yield "Hello!"; 
    }
}
Run Code Online (Sandbox Code Playgroud)