打字稿:根据接口键获取接口属性的类型

时间:2021-04-01 20:31:09

标签: javascript typescript strong-typing

我正在构建一个需要一次更新对象的一个​​字段的函数。 该对象是通过接口 T 定义的。

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

这应该是这个函数的类型签名:

(key: keyof T, value: typeof T[key]) => void

这会产生错误:'key' refers to a value, but it is being used as a type here. Did you mean 'typeof key'?。 IMO 我的意思不是 typeof key,因为 typeof key 将是 T 的任何键,但我希望 value 属性的类型为 TypeA if {{ 1}} 等

如何选择key = a对应键值的类型?

1 个答案:

答案 0 :(得分:1)

您正在尝试使用实际值索引类型,这是不允许的。您需要使用类型 (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),这就是编译器建议将真实值转换为类型的原因。