我在 typescript 中有以下通用类
type UserId = number
type Primitive = string | number | boolean
class ColumnValue<T, S extends Primitive> {
constructor(public columnName: String, public value: S) { }
}
abstract class Column<T> {
constructor(public columnName: String) { }
public set<S extends Primitive>(value: T): ColumnValue<T, S> {
return new ColumnValue(this.columnName, this.getValue(value))
}
public abstract getValue<S extends Primitive>(value: T): S
}
let id = new class extends Column<UserId> {
constructor() { super("id") }
public getValue(value: UserId): number {
return value
}
}()
但我不知道为什么会出现此错误 类“(匿名类)”错误地扩展了基类“列”。
属性“getValue”的类型不兼容。
类型 '(value: number) => number' 不能分配给类型 '(value: number) => S'。
类型 'number' 不能分配给类型 'S'
最佳答案
上 Column
setter和getter S
不一定是相同的类型,因此您应该将类型参数移动到其父类:Column<T, S extends Primitive>
.
type UserId = number
type Primitive = string | number | boolean
class ColumnValue<T, S extends Primitive> {
constructor(public columnName: String, public value: S) { }
}
abstract class Column<T, S extends Primitive> {
constructor(public columnName: String) { }
public set(value: T): ColumnValue<T, S> {
return new ColumnValue(this.columnName, this.getValue(value))
}
public abstract getValue(value: T): S
}
let id = new class extends Column<UserId, number> {
constructor() { super("id") }
public getValue(value: UserId): number {
return value
}
}()
以上版本has no errors至少。
我知道您可能想推断
S
来自您与 setter 一起使用的任何类型,但 Column
在实例化时必须有一个明确定义的类型,这意味着你要么在调用构造函数时显式(即 new Column<UserId, number>(...)
),要么添加一个 S
参数在构造函数中所以 S
可以从中推断出(如 new Column<UserId>('id', 123)
)
关于 typescript : generic type with primitive types constrain,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46387138/