2016-07-06 43 views
0

有没有什么办法可以在类型安全的TS中复制下面的JS模式?如何在Typescript中实现无原型构造函数?

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工作是类型安全 - 到目前为止,那么好。

我的问题是,似乎没有任何方式键入提示参数作为接口的实例吗?

例如(当然)这不工作:

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

有没有什么办法的类型提示的input参数作为返回型的InputStream功能

我的意思是,由于它能够推断接口,因此显然声明了接口,这似乎是多余的。

当然,我也可以将它移植到一个真正的课堂上 - 这看起来更“正确”,但却使得非常冗长。

有没有其他的方式来实现类似的东西,也许与模块?我注意到模块可以调用模块中声明的函数,而不需要this的限定,并且通常希望类方法和父类可以实现,但是TS团队拒绝了这个请求。

回答

0

如果你需要在其他地方使用它的类型,你确实想输入InputStream的返回值,这也是很好的文档。你所要求的是某种元数据,比如“给我这个函数返回的类型”,我认为打字稿不具备这种能力。

推论最好留给小lambda函数imo。

仅供参考,你可以这样做:

const input = InputStream('abcd') 

function TokenStream(input2: typeof input) { 

} 

但你需要一个实际值将输入第二个函数的参数,这是奇怪的,可能不是你想要的。