typescript : generic type with primitive types constrain

标签 typescript typescript-generics

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

相关文章:

node.js - 无法安装 NodeJS 模块

typescript - 是否可以使用节点 js 云功能访问 FieldValue?

javascript - 将类的静态方法转换为变量 typescript

typescript - 在 TypeScript 中,如何创建一个通用函数,根据给定的类名和函数来推断函数的参数?

typescript - 为什么 redux-starter-kit 中 PayloadAction 中的 "boolean"变成了 "false & true"?

javascript - 无法导出 Typescirpt 中的接口(interface) - 请求的模块不提供名为 Settings 的导出

javascript - T 将 String 扩展为映射类型的索引

Typescript:使用函数数组的 ReturnType(已编辑)

reactjs - 类型 'ref' 上不存在属性 'IntrinsicAttributes'