我在 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
}
}()
但我不知道为什么会出现这个错误:
Class '(Anonymous class)' incorrectly extends base class 'Column<number>'.
Types of property 'getValue' are incompatible.
Type '(value: number) => number' is not assignable to type '<S extends Primitive>(value: number) => S'.
Type 'number' is not assignable to type 'S'
On Column
吸气剂和吸气剂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
}
}()
上面的版本没有错误 https://www.typescriptlang.org/play/#src=type%20UserId%20%3D%20number%0D%0Atype%20Primitive%20%3D%20string%20%7C%20number%20%7C%20boolean%0D%0Aclass%20ColumnValue%3CT%2C%20S%20extends%20Primitive%3E%20%7B%0D%0A%20%20%20%20constructor(public%20columnName%3A%20String%2C%20public%20value%3A%20S)%20%7B%20%7D%0D%0A%7D%0D%0Aabstract%20class%20Column%3CT%2C%20S%20extends%20Primitive%3E%20%7B%0D%0A%20%20%20%20constructor(public%20columnName%3A%20String)%20%7B%20%7D%0D%0A%20%20%20%20public%20set(value%3A%20T)%3A%20ColumnValue%3CT%2C%20S%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20return%20new%20ColumnValue(this.columnName%2C%20this.getValue(value))%0D%0A%20%20%20%20%7D%0D%0A%20%20%20%20public%20abstract%20getValue(value%3A%20T)%3A%20S%0D%0A%7D%0D%0Alet%20id%20%3D%20new%20class%20extends%20Column%3CUserId%2C%20number%3E%20%7B%0D%0A%20%20%20%20constructor()%20%7B%20super(%22id%22)%20%7D%0D%0A%20%20%20%20public%20getValue(value%3A%20UserId)%3A%20number%20%7B%0D%0A%20%20%20%20%20%20%20%20return%20value%0D%0A%20%20%20%20%7D%0D%0A%7D()至少。
我知道您可能想推断S
无论您与 setter 一起使用什么类型,但是Column
实例化时必须具有明确定义的类型,因此这意味着您可以在调用构造函数时显式(即new Column<UserId, number>(...)
)或添加一个S
构造函数中的参数所以S
可以从中推断出(例如new Column<UserId>('id', 123)
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)