[英]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.