Typescript中具有泛型的子类型约束

伊凡五世

具有以下代码:

export interface IModel {
  id: string;
}

export interface StatusResponse<
  TModel extends IModel = IModel,
  TResponse = any
> {
  item: TModel;
  response: TResponse;
}

export class Transport<TItem extends IModel = IModel> {
  save(item: TItem): StatusResponse<TItem> {

    const result: StatusResponse<TItem> = {
      item: { // << error
        id: ""
      },
      response: {
        stat: "ok"
      }
    };

    return result;
  }
}

save函数内部,我收到此错误:

 Type '{ id: string; }' is not assignable to type 'TItem'.
  '{ id: string; }' is assignable to the constraint of type 'TItem', but 'TItem' could be instantiated with a different subtype of constraint 'IModel'.

什么是困惑我的是,该接口StatusResponse具有通用相同的约束和缺省值TModel作为类TransportTItem但是,里面save的功能,他们都表示不匹配。

如果我这样编写save方法,就没有问题。


  save(item: TItem): StatusResponse {

    const result: StatusResponse = {
      item: {
        id: ""
      },
      response: {
        stat: "ok"
      }
    };

    return result;
  }


请注意,我从中删除了通用类型,StatusResponse因此它采用了默认值。

我不确定这是怎么回事。

打字稿游乐场

Aleksey L.

想一想,如果将上述类与需要附加属性的通用参数一起使用,将会发生什么情况。例如:

new Transport<{ id: string, additionalProp: string }>()

保存方法将产生缺少结果的结果additionalProp-这就是为什么您会收到错误消息。


不知道这是否适合您的情况,但是您可以将原始项目传播到响应中以保留类型结构:

export class Transport<TItem extends IModel = IModel> {
  save(item: TItem): StatusResponse<TItem> {

    const result: StatusResponse<TItem> = {
      item: {
        ...item,
        id: ""
      },
      response: {
        stat: "ok"
      }
    };

    return result;
  }
}

操场

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

TypeScript泛型:React中具有联合类型的道具

来自分类Dev

TypeScript泛型:React中具有联合类型的道具

来自分类Dev

.NET泛型中带有子类型约束的实际示例

来自分类Dev

为什么在具有可比约束的泛型函数中丢失泛型类型信息?

来自分类Dev

有没有办法在TypeScript中实例化受约束的泛型类型的实例?

来自分类Dev

如何约束泛型类型以使其具有new()?

来自分类Dev

具有新类型约束的泛型构造函数

来自分类Dev

C#从具有约束的泛型推断类型

来自分类Dev

具有类型约束的泛型的C#nameof

来自分类Dev

Swift 转换为具有约束的泛型类型

来自分类Dev

具有多个参数的泛型类中的从属类型约束

来自分类Dev

具有子类泛型的子类

来自分类Dev

在TypeScript中,如何获取具有多个类型参数的方法中的泛型类型参数?

来自分类Dev

使泛型类的函数仅接受具有相同泛型类型但受更多约束的参数

来自分类Dev

如何在Swift中从带有类型别名的协议中引用具有约束的泛型类?

来自分类Dev

为什么实现具有类型约束的泛型接口的泛型类需要重复这些约束?

来自分类Dev

Typescript从具有泛型类型的对象索引调用函数

来自分类Dev

具有类型依赖参数的 TypeScript 泛型方法

来自分类Dev

泛型类型子类

来自分类Dev

具有静态成员约束的泛型类型上的类型推断失败

来自分类Dev

具有对其他类型参数的约束的类型参数的泛型推断

来自分类Dev

Swift 中的多级泛型类型约束

来自分类Dev

强制泛型在TypeScript中实现属性(约束泛型)

来自分类Dev

类中具有2个泛型类型的方法,其中1个泛型类型

来自分类Dev

类中具有2个泛型类型的方法,其中1个泛型类型

来自分类Dev

具有泛型返回类型的vararg方法中的@SafeVarargs

来自分类Dev

TypeScript中具有泛型的递归对象文字

来自分类Dev

具有两个类型约束和接口实现的泛型类

来自分类Dev

如何从具有基本类型约束的泛型方法获取typeof(T)?

Related 相关文章

  1. 1

    TypeScript泛型:React中具有联合类型的道具

  2. 2

    TypeScript泛型:React中具有联合类型的道具

  3. 3

    .NET泛型中带有子类型约束的实际示例

  4. 4

    为什么在具有可比约束的泛型函数中丢失泛型类型信息?

  5. 5

    有没有办法在TypeScript中实例化受约束的泛型类型的实例?

  6. 6

    如何约束泛型类型以使其具有new()?

  7. 7

    具有新类型约束的泛型构造函数

  8. 8

    C#从具有约束的泛型推断类型

  9. 9

    具有类型约束的泛型的C#nameof

  10. 10

    Swift 转换为具有约束的泛型类型

  11. 11

    具有多个参数的泛型类中的从属类型约束

  12. 12

    具有子类泛型的子类

  13. 13

    在TypeScript中,如何获取具有多个类型参数的方法中的泛型类型参数?

  14. 14

    使泛型类的函数仅接受具有相同泛型类型但受更多约束的参数

  15. 15

    如何在Swift中从带有类型别名的协议中引用具有约束的泛型类?

  16. 16

    为什么实现具有类型约束的泛型接口的泛型类需要重复这些约束?

  17. 17

    Typescript从具有泛型类型的对象索引调用函数

  18. 18

    具有类型依赖参数的 TypeScript 泛型方法

  19. 19

    泛型类型子类

  20. 20

    具有静态成员约束的泛型类型上的类型推断失败

  21. 21

    具有对其他类型参数的约束的类型参数的泛型推断

  22. 22

    Swift 中的多级泛型类型约束

  23. 23

    强制泛型在TypeScript中实现属性(约束泛型)

  24. 24

    类中具有2个泛型类型的方法,其中1个泛型类型

  25. 25

    类中具有2个泛型类型的方法,其中1个泛型类型

  26. 26

    具有泛型返回类型的vararg方法中的@SafeVarargs

  27. 27

    TypeScript中具有泛型的递归对象文字

  28. 28

    具有两个类型约束和接口实现的泛型类

  29. 29

    如何从具有基本类型约束的泛型方法获取typeof(T)?

热门标签

归档