Typescript:根据接口键获取接口属性的类型

4

我正在编写一个函数,需要逐个更新对象的一个字段。这个对象是通过接口T定义的。

interface T {
  a: TypeA;
  b: TypeB;
  c: TypeC;
}

这个函数应该有以下类型标记:
(key: keyof T, value: typeof T[key]) => void

这将生成错误:'key'指的是一个值,但在此处被用作类型。您是否意味着'typeof key'?。 我个人认为我并不是想要 typeof key,因为 typeof key 会是 T 的任何键,但如果 key = a 等,则我希望 value 属性为类型 TypeA

如何选择与 T 的相应键值相关联的类型?

1个回答

11
您正在尝试使用实数值来索引类型,这是不允许的。您需要使用类型来访问它 (playground)。
interface T {
  a: number;
  b: string;
  c: boolean;
}

const func = <K extends keyof T>(key: K, value: T[K]) => {};

func("a", 5);
func("b", 5); // Argument of type 'number' is not assignable to parameter of type 'string'.

在 TypeScript 中,类型和实际值之间存在明显区别,因为在转译后,类型信息将丢失。因此,您不能使用实际值来定义类型逻辑。唯一的方法是提取实际值的类型值(例如,使用 typeof),这也是编译器建议您将实际值转换为类型的原因。

我遇到了类似的情况:type MyType = { key: keyof T; func: (valType: T[keyof T]) => void; };但这会返回T中所有键的valType。我该如何确保只从key解释出所需的类型? - aayani
你需要第二个泛型来表示键:https://tsplay.dev/WJAVVm - Mirco S.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接