我现在正在使用TypeScript,正在研究Playground页面,着眼于将现有项目转换为TypeScript。
我解决了我正在处理的问题,但在这个过程中我遇到了一些我不太了解的问题。它考虑了最简单的通用队列类,这里部分显示。
class Queue<T> {
private store: T[] = [];
public enqueue(item: T) {
this.store.push(item);
}
}
const queue = new Queue<number>();
queue.enqueue(5); // works
queue.enqueue('six') // properly errors
当然,这很好。如果后备存储被键入为两个类型变量的并集,它也可以正常工作。
class Queue<T, U> {
private store: (T | U)[] = [];
public enqueue(item: T | U) {
this.store.push(item);
}
}
const queue = new Queue<number, boolean>();
queue.enqueue(5); // works
queue.enqueue(true); // works
queue.enqueue('six') // properly errors
但是,当我使商店成为类型变量的联合类型和已经存在的具体类型时,类型检查对enqueue
不起作用。 (Empty
是一个单例类,用于通过返回特定的EMPTY
对象来模拟我指示空队列的旧方法;我不确定最好的方法是什么,但那是另一个问题。)
class Empty {
// implementation of singleton class
}
const EMPTY = Empty.instance;
class Queue<T> {
private store: (T | Empty)[] = [];
public enqueue(item: T | Empty) {
this.store.push(item);
}
}
const queue = new Queue<number>();
queue.enqueue(5); // works
queue.enqueue(EMPTY); // works
queue.enqueue('six') // also works, but it shouldn't
为T | Empty
引入类型别名无济于事。
现在实际上,这对我来说不是问题,因为我的队列实现只存储类型T
。只有我的dequeue
签名中有一个联合类型,因为如果商店是空的,它会返回EMPTY
(并且工作正常)。但我当然可以看到一个带有类型参数和具体类型的联合类型数组的位置,并且没有深入挖掘它,它似乎应该是可能的。
这是我不理解语言的东西,我做错了,还是仅仅是编译器限制?