【发布时间】:2020-12-30 16:47:38
【问题描述】:
我正在用 typescript 编写一个类,但不知道如何区分泛型和数字类型参数。代码示例
class Test<T> {
remove(value: T): boolean;
remove(index: number): boolean;
remove(indexOrValue: T|number): boolean {
if (typeof indexOrValue === "number") {
/* What about new Test<number>() */
const index = indexOrValue as number;
this.items.splice(index, 1)
return true;
} else {
const index = this.items.indexOf(indexOrValue as T)
if (index > -1) this.items.splice(index, 1);
return true;
}
return false;
}
}
PS:我不知道这个问题,我在这里写而不是搜索
【问题讨论】:
-
解决这个问题的唯一方法是对不同的操作使用两种不同的方法,例如
remove(T)和removeAt(number)。作为一个额外的好处,这使代码更具可读性,并且您不需要任何运行时决策。 -
我知道这一点。但是我正在编写已经在许多其他类中使用的基类。那就是我必须实现相同的方法。
-
如果你在类型 T 的类中有一个字段,那么你可以在参数类型之上检查它的类型。这是一个黑客,但它会工作。当然你无法区分调用者的意图。如果没有任何外部信息,就无法做到这一点,因为
T=number的签名是等效的,因此无法区分。 -
如果
T是number,那么当有人调用这个函数时如何知道他们是要按值删除还是按索引删除? -
@IngoBürk 即使那样,您也只能删除元素,而不能再按索引。
标签: typescript typescript-generics