更新:问题是TypeScript的一个限制,该问题现在在Typescripts GitHub上: https://github.com/microsoft/TypeScript/issues/47440
我目前有以下代码:
class Table<T,> {
constructor(records: T[], columns: Column<T>[]) { ... }
}
class Column<T> {
constructor(name: string, transformer: (item: T) => string) { ... }
addTooltip(transformer: (item: T) => string): this { ... }
}
class Building {
constructor (public name: string) {}
}
const buildings = [
new Building("test"),
new Building("station")
];
我想创建一个表格,而不必指定
T
的类型为Building
。这目前是可行的,因为typescript可以从buildings数组中推断出类型,并且它能正常工作。即使在Column的
transformer
中,我仍然能得到类型提示。const table = new Table(buildings, [
new Column("Name", building => building.name)
]);
但是当我使用 addTooltip
时,TypeScript 无法确定 T
是什么并且完全崩溃了,因为 Column
假定 T
是 unknown
。
const table = new Table(buildings, [
new Column("Name", building => building.name),
new Column("Name", building => building.name).addTooltip(t => t.name)
]);
有没有办法告诉TypeScript使用其“记录”构造函数参数的类型作为T的来源,而忽略列认为的T - 而不使用“new Table<Building>(...)”? 我知道我们可以使用“columns:Column < any > []”,但是在Columns中的类型检查将无法工作。
addTooltip()
,TS 就无法真正找出构造函数的类型参数,因为它必须向后推断。 - biziclopTable -> addTooltip() -> Building
,但由于addTooltip()
依赖于Building
,所以这会失败。 - biziclopthis
的函数可以更加智能地处理,但我猜现在还没有这样的功能。我所能想到的都是解决方法,比如让构造函数接受多个转换器。你想要一个带有解决方法的答案吗?还是一个简单的“不行,对不起”的答案? - jcalz