繁体   English   中英

如何在Typescript中实现无原型构造函数?

[英]How to implement prototype-less constructors in Typescript?

有什么方法可以在类型安全的情况下在TS中复制以下JS模式?

function InputStream(input) {
    var pos = 0, line = 1, col = 0;
    return {
        next  : next,
        peek  : peek,
        eof   : eof,
        croak : croak,
    };
    function next() {
        var ch = input.charAt(pos++);
        if (ch == "\n") line++, col = 0; else col++;
        return ch;
    }
    function peek() {
        return input.charAt(pos);
    }
    function eof() {
        return peek() == "";
    }
    function croak(msg) {
        throw new Error(msg + " (" + line + ":" + col + ")");
    }
}

如果添加类型提示,则会得到以下信息:

function InputStream(input: string) {
    var pos = 0
    var line = 1
    var col = 0

    return {
        next,
        peek,
        eof,
        croak
    }

    function next(): string {
        var ch = input.charAt(pos++);
        if (ch == "\n") line++, col = 0; else col++;
        return ch;
    }

    function peek(): string {
        return input.charAt(pos);
    }

    function eof(): boolean {
        return peek() == "";
    }

    function croak(msg):string {
        throw new Error(`${msg} (${line}:${col})`);
    }
}

TS会推断出返回对象的接口,因此使用InputStream是类型安全的-到目前为止,一切都很好。

我的问题是,似乎没有任何方法可以将参数类型提示为than接口的实例?

例如(当然),这是行不通的:

function TokenStream(input: InputStream) {
    // ...
}

有什么方法可以将input参数提示为InputStream函数的返回类型

我的意思是,没有明确声明接口,这似乎是多余的,因为它能够推断出接口。

当然,我也可以将其移植到真实的类中-看起来更“正确”,但是使这样的代码非常冗长。

是否有其他方法可以实现类似的目标,也许使用模块? 我注意到,模块能够调用模块中声明的函数而无需使用this进行限定,并且经常希望类方法和父类能够实现此功能,但是TS团队拒绝了该请求。

如果确实需要在其他地方输入TypeStream的返回值,那么您确实要输入该值,这也是很好的文档。 您要的是某种元数据,例如“给我该函数返回的类型”,我不认为打字稿具有这种功能。

对于小的lambda函数imo最好是进行推断。

作为参考,您可以执行以下操作:

const input = InputStream('abcd')

function TokenStream(input2: typeof input) {

}

但是您需要一个实际值来键入第二个函数的参数,这很奇怪,而且可能不是您想要的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM