如何编写抽象打字稿泛型?

圈码

给定以下类型

interface Base {
  id: string;
}

interface A extends Base {
  propA: string;
}

interface B extends Base {
 propB: string;
}

我想表达一个MyGeneric<T>具有以下约束的泛型

  1. T 必须是一个对象
  2. T 密钥必须是 string
  3. T值必须为instanceOf Base(类型为Base,或为扩展Base的类型)

    (3. wasT值必须与Base接口兼容,但已对其进行了改写,以免造成不理解)

我试过了

interface MyConstraint {
  [key: string]: Base
}

interface MyGeneric<T extends MyConstraint> {
  data: T
}

但是在这种情况下,当用户想要使用它时,它有两个缺点:

interface userDefinedInterface1 {
  a: A;
  b: B;
}

function foo1(p: MyGeneric<userDefinedInterface1>):void {
  //drawback 1: this throws TS2344:
  //Type 'userDefinedInterface1' does not satisfy the constraint 'userDefinedInterface1'.   //Index signature is missing in type 'userDefinedInterface1'.
}

//to solve drawback 1, the user has to extend MyConstraint
interface userDefinedInterface2 extends MyConstraint {
  a: A;
  b: B;
}

function foo2(p: MyGeneric<userDefinedInterface2>):void {
  //drawback 2: here, ts considers every string property as valid because of [key: string] 
  console.log(p.data.arbitraryKey);//this is valid
}

有没有一种方法可以定义interface MyGeneric<T>尊重上述3个约束条件而又没有这2个缺点?

扬·雅库布·纳尼什塔

我认为这应该可以解决您的两个缺点:

type MyConstraint<T> = {
  [K in keyof T]: T[K] extends Base ? T[K] : never;
};

interface MyGeneric<T extends MyConstraint<T>> {
  data: T;
}

为使MyConstraint通用的小价格现在,如果您执行了以下操作,那么您的两个示例都应该可以正常工作:

interface UserDefinedInterface3 {
  a: A;
  b: B;
  c: string;
}

type Wrong = MyGeneric<UserDefinedInterface3>;

您会收到一条错误消息,指出属性类型c不兼容。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

打字稿类型、泛型和抽象类

来自分类Dev

如何理解复杂的打字稿泛型类型?

来自分类Dev

打字稿:重载并检查泛型

来自分类Dev

打字稿:根据泛型推断

来自分类Dev

打字稿泛型-扩展类

来自分类Dev

打字稿泛型类型htmlerap

来自分类Dev

打字稿:从泛型中提取类型

来自分类Dev

打字稿 > 泛型 > 联合约束

来自分类Dev

如何检查泛型K是否为泛型M的一部分。打字稿通用 Redux

来自分类Dev

打字稿:在这种情况下如何使用泛型键入函数?

来自分类Dev

如何将两个打字稿泛型联系在一起

来自分类Dev

如何在处理来自API响应的可选包含的打字稿中制作泛型类型?

来自分类Dev

如何在打字稿中使用泛型扩展类?

来自分类Dev

打字稿:如何从返回函数的输入参数推断高阶函数中的泛型类型

来自分类Dev

如何为在打字稿中扩展泛型类的类添加构造函数?

来自分类Dev

如何在打字稿中展平泛型类型声明?

来自分类Dev

如何在打字稿中解析 C# 泛型集合列表

来自分类Dev

打字稿如何将属性声明为其类的泛型参数 T 的键列表?

来自分类Dev

打字稿:如何键入React抽象组件?

来自分类Dev

如何使用打字稿编写节点模块?

来自分类Dev

如何使用打字稿编写marionettejs模块?

来自分类Dev

如何使用打字稿编写节点模块?

来自分类Dev

打字稿中的泛型无法正常工作?

来自分类Dev

打字稿:将typeof与泛型一起使用

来自分类Dev

对象的类型为“未知”打字稿泛型

来自分类Dev

对象的类型为“未知”打字稿泛型

来自分类Dev

反应引用和打字稿泛型的协方差

来自分类Dev

使用keyof枚举和泛型的打字稿

来自分类Dev

推断打字稿中嵌套的泛型类型?

Related 相关文章

热门标签

归档