如何在Typescript中实现无原型构造函数?
问题描述:
有没有什么办法可以在类型安全的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团队拒绝了这个请求。
答
如果你需要在其他地方使用它的类型,你确实想输入InputStream的返回值,这也是很好的文档。你所要求的是某种元数据,比如“给我这个函数返回的类型”,我认为打字稿不具备这种能力。
推论最好留给小lambda函数imo。
仅供参考,你可以这样做:
const input = InputStream('abcd')
function TokenStream(input2: typeof input) {
}
但你需要一个实际值将输入第二个函数的参数,这是奇怪的,可能不是你想要的。