当前位置: 首页 > 知识库问答 >
问题:

typeScript:带有基元类型约束的泛型类型

公孙嘉禧
2023-03-14

我在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'(匿名类)'不正确地扩展基类'列'。属性getValue的类型不兼容。类型'(值:数字)=

共有2个答案

周和歌
2023-03-14

您的getValue使用泛型S,因此继承的实现也必须使用S

let id = new class extends Column<UserId> {
    constructor() { super("id") }
    public getValue<S extends Primative>(value: UserId): S {
        return <S>value
    }
}()

如果您将S带到类中,您的函数可以缩小到数字

abstract class Column<T, S extends Primative> {
    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, UserId> {
    constructor() { super("id") }
    public getValue(value: UserId): number {
        return value
    }
}()
袁枫涟
2023-03-14

列上getter和setterS不一定是同一类型,因此您应该将类型param移动到其父类:

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
    }
}()

以上版本至少没有错误。

我知道您可能想从setter使用的任何类型推断S,但是Column必须在实例化时具有定义良好的类型,因此这意味着您在调用构造函数(即newcolumn)时要么显式

 类似资料:
  • 泛型的类型约束 swapTwoValues(_:_:)函数和Stack类型可以用于任意类型. 但是, 有时在用于泛型函数的类型和泛型类型上, 强制其遵循特定的类型约束很有用. 类型约束指出一个类型形式参数必须继承自特定类, 或者遵循一个特定的协议、组合协议. 例如, Swift的Dictionary类型在可以用于字典中键的类型上设置了一个限制. 如字典中描述的一样,字典键的类型必须是可哈希的. 也

  • 我在TypeScript 2.4中遇到一个错误。2在泛型类上,该泛型类的约束与不太严格的接口不兼容。我得到以下错误: TS/组件/Schedule.ts(37,13):错误TS2322:键入{人周末视图: PlanItemschduleView; project...属性“人员周末视图”与索引签名不兼容。类型PlanItemschduleView不能分配给类型IPlanItemschduleVie

  • 这将使约束在范围内,为提供额外的参数。这里我的意图是包含一些(隐藏的)具体类型,它应该用作多态函数GHC compulins的具体类型: 我的用例的假设是1。同时计算和2。隐藏类型的值涉及(至少部分)第一个元组元素的计算。这意味着我不想在中调用两次(一次是获取,一次是使用该类型绑定第一个元组元素)。在存在约束的情况下,是否有某种方法使的定义成为可能?

  • 本文向大家介绍TypeScript 类型参数作为约束,包括了TypeScript 类型参数作为约束的使用技巧和注意事项,需要的朋友参考一下 示例 使用TypeScript 1.8,类型参数约束可以从同一类型参数列表中引用类型参数。以前这是一个错误。            

  • 在TypeScript中,我有一个接受带有约束的泛型参数的函数: 现在,我正在尝试这样做,以便您可以选择添加另一个类型作为返回类型的一部分。但是,当我这样做时,我必须为U类型提供一个默认参数。这使得TypeScript停止推断U的值,并使用我提供的默认类型: 所以我的问题是,有没有办法让TypeScript继续从参数推断类型?我不想为U提供默认类型,我总是希望TypeScript推断该值。伪代码,

  • 所以我有这样的课: 现在我正在寻找一个类型约束,它允许我使用所有可以是的类型参数。这意味着所有引用类型,以及所有()类型: 应该是可能的。 使用作为类型约束只允许我使用引用类型。 附加信息:我正在编写一个pipes and filters应用程序,并希望使用引用作为传递到管道中的最后一项,这样每个过滤器都可以很好地关闭,进行清理,等等。。。