在扩展接受T的类TextClass时,我希望类ImplTestClass中的属性eventList的类型是一个具有所有可能值AllowedEvents的数组

我似乎想不出这件事.如果有人能为我指明正确的方向,我会很高兴的!

type EventMap = Record<string, unknown>; 

abstract class TestClass<T extends EventMap> {
  public eventList: Array<T[keyof T]>;

  constructor() {
    this.eventList = [];
  }
}


interface AllowedEvents extends EventMap {
  created: { time: string; userId: number; createdId: number; },
  removed: { time: string; userId: number; removedId: number; }
}

class ImplTestClass extends TestClass<AllowedEvents> {
  getEventList() {
    return this.eventList;
    // I would like `eventList` to have the type 
    // ({ time: string; userId: number; createdId: number; } | { time: string; userId: number; removedId: number; })[]
  }
};


推荐答案

为此,您可以使用类型别名而不是接口?,并且不显式指定它扩展EventMap:

type AllowedEvents = {
    created: { time: string; userId: number; createdId: number };
    removed: { time: string; userId: number; removedId: number };
};

该类型是Record<string, unknown>的有效子类型,因此可以将其用作抽象基类的类型参数.当您将其用作类型参数时,您的子类代码会看到您想要的eventList类型.

Playground link


FWIW:我不知道why它必须是一个类型别名,而不是一个接口.当我tried it as an interface的时候,TypeScrip不允许我将它用作基类的类型参数,说它缺少索引签名.

Typescript相关问答推荐

Typescript问题和缩减器状态不会在单击时添加用途.属性'状态和调度'不存在于userContextType类型上'|null'

Typescript自定义键映射

Angular 行为:属性类型从SignalFunction更改为布尔

使Typescribe强制所有对象具有相同的 struct ,从两个选项

STypescript 件的标引签名与功能签名的区别

对于合并对象中的可选属性(例如选项),类型推断可能是错误的

从子类构造函数推断父类泛型类型

是否可以基于对象的S属性值[]约束对象的其他属性值用于类型化的对象数组?

在类型脚本中创建泛型类型以动态追加属性后缀

如何 bootstrap TS编译器为类型化属性`T`推断正确的类型?

布局组件中的Angular 17命名路由出口

TypeScrip中的类型安全包装类

以Angular 执行其他组件的函数

TypeScrip错误:为循环中的对象属性赋值

复选框Angular 在Ngfor中的其他块中重复

如何在具有嵌套数组的接口中允许新属性

使用Cypress测试从Reaction受控列表中删除项目

类型';只读<;部分<;字符串|记录<;字符串、字符串|未定义&>';上不存在TS 2339错误属性.属性&q;x&q;不存在字符串

通过函数传递确切的类型,但验证额外的字段

基于参数的 TS 返回类型