我需要TypeScript泛型方面的帮助;如何访问ActionAdd接口中的T["value"]字段?

type UserValue = { username: string; };

interface User {
  id: number;
  value: UserValue;
}

interface ActionAdd<T = unknown> {
  type: "ADD";
  value: T["value"]; // Type '"value"' cannot be used to index type 'T'.
}

type UserAction = ActionAdd<User>;

T对象将始终具有{ value }个关键点,不一定是unknown类型-但该对象也将具有其他关键点.

我试过:

interface ActionAdd<T, K extends keyof T> {
  type: "ADD";
  value: T[K];
}

type UserAction = ActionAdd<User, "value">;

-哦,不.

interface ActionAdd<T = unknown> {
  type: "ADD";
  value: T extends { value: infer V } ? V : never;
}

type UserAction = ActionAdd<User>;

推荐答案

如果T总是有一个value键,那么您需要告诉编译器,从constrainingT{value: unknown}:

interface ActionAdd<T extends { value: unknown }> {
  type: "ADD";
  value: T["value"]; // okay
}

Playground link to code

Typescript相关问答推荐

类型脚本如何将嵌套的通用类型展开为父通用类型

net::BER_RECTION_REUSED和Uncatch使用Axios和TanStack-Query useMutation时未捕获错误(DelivercMutation)

TypScript手册中的never[]参数类型是什么意思?

角形标题大小写所有单词除外

如何在排版中正确键入中间件链和控制器链

如果请求是流,如何等待所有响应块(Axios)

学习Angular :无法读取未定义的属性(正在读取推送)

如何使默认导出与CommonJS兼容

如何使所有可选字段在打印脚本中都是必填字段,但不能多或少?

为什么我的导航在使用Typescript的React Native中不起作用?

如何缩小函数的返回类型?

与toast.error一起react 中的Async TUNK错误消息

tailwind css未被应用-react

创建一个TypeScrip对象并基于来自输入对象的约束定义其类型

Angular NG8001错误.组件只能在一个页面上工作,而不是在她的页面上工作

必需的输入()参数仍然发出&没有初始值设定项&q;错误

如何通过转换器类继承使用多态将对象从一种类型转换为另一种类型

类型脚本中函数重载中的类型推断问题

如何键入';v型';

req.files = 未定义(Multer、Express、Typescript)