TypeScript 接口中的自引用键类型

施尼克

我有一个具有以下界面的对象,我想以编程方式更新它:

interface ITypes {
  num: number;
  str: string;
  bol: boolean;
};

const obj: Partial<ITypes> = {}; // I want to update this programatically

我希望能够定义 akey和 avalobj使用这些值更新我我希望它key只能是ITypes界面中的键之一,然后该值需要是key从界面中选择的指定类型我可以使用以下代码很好地做到这一点:

const key: keyof ITypes = "num"; // key must be a key from the ITypes interface
const val: ITypes[typeof key] = 1; // val must be the type specified at `"num"` - `number`
obj[key] = val;

上面的代码工作正常,但是,现在,我想在一个对象中定义它们,而不是将keyval作为单独的变量,因此我需要定义一个接口。但是,我在val. 这是我迄今为止尝试过的:

interface IUpdatePayload {
  key: keyof ITypes;
  val: ITypes[typeof this.key]; // Type 'any' cannot be used as an index type.
};
const updatePayload: IUpdatePayload = {key: "num", val: "1"}; // should complain that `val` is not a number
obj[updatePayload.key] = updatePayload.val; 

我尝试使用自引用接口的key类型typeof this.key(我在这个答案中看到了建议)但是这是错误的Type 'any' cannot be used as an index type.,我猜这是因为键实际上没有被定义为具有第一个工作示例中的值使用变量。我的问题是,有没有办法使这项工作能够val采用接口中key指定的定义的类型ITypes

克里斯巴约林

您可以使用映射类型从任何类型生成键/值对的联合:

type KVPairs<T, K extends keyof T = keyof T> = 
    K extends keyof T
        ? { key: K, val: T[K] } 
        : never;

然后,您可以创建自定义联合:

// {key: "num", val: number} | {key: "str", val: string} | {key: "bol", val: boolean}
type IUpdatePayload = KVPairs<ITypes>;

如果需要,此类型还允许您选择键的子集:

// {key: "num", val: number} | {key: "str", val: string}
type NumOrStr = KVPairs<ITypes, "num"|"str">

但是,将对象文字分配给联合类型时,错误并不总是很清楚:

const obj: IUpdatePayload = { key: "num", val: "1" };
/*
Type '{ key: "num"; val: string; }' is not assignable to type 'IUpdatePayload'.
  Type '{ key: "num"; val: string; }' is not assignable to type '{ key: "bol"; val: boolean; }'.
    Types of property 'key' are incompatible.
      Type '"num"' is not assignable to type '"bol"'.
*/

操场

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

类像 Typescript 接口中的类型

TypeScript为接口中的特定键及其类型的匹配值添加了类型支持

如何从TypeScript的接口中排除键

typescript:获取接口中基本类的类型

如何仅收集类型中的键,该类型的对象具有某些特定键作为 Typescript 接口中的值?

TypeScript中的自引用类型

TypeScript:类型定义(接口)的引用子类型

Typescript:接口中的常量

在typescript中的接口中精确指定多个类型的值:

Typescript:将函数作为接口中的类型传递

如何在 Typescript 函数接口中约束泛型类型?

如何防止在TypeScript类型和接口中使用“ any”

在TypeScript中自引用映射类型

接口中的TypeScript可选功能

接口中的Typescript静态方法

TypeScript:接口与类型

TypeScript 中的接口与类型

类型数组的Typescript接口

Typescript实现具有相同键但类型不同的接口

如何在TypeScript中返回接口键类型?

Typescript 根据参数强制函数返回类型为接口的键

TypeScript:继承类中静态方法的自引用返回类型

TypeScript:继承类中方法的自引用返回类型

TypeScript中数组的接口键

如何在Typescript接口中为函数定义void的返回类型?

如何从Typescript的接口中提取特定类型的所有字段的名称?

在Typescript中,如何在接口中使用字符串文字类型?

如何从接口中忽略一个属性,而不是在TypeScript中省略类型?

在 typescript 的接口中包含方法实现