gpt4 book ai didi

typescript : generic type with primitive types constrain

转载 作者:行者123 更新时间:2023-12-03 23:17:49 28 4
gpt4 key购买 nike

我在 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com