如何根据另一个属性的键在接口中键入属性在 TypeScript 中具有未知结构?

ㄌㄇ是我

我用了一个模块可以做这样的事情

function print(obj, key) {
  console.log(obj[key])
}

print({'test': 'content'}, '/* vs code will show code recommendation when typing */')

我想要这个功能,但我忘记了模块的名称,我什至不确定我是否记错了(也许这是不可能的)。

我正在处理一个包并且有这样的代码:

interface Box {
  content: {
    [key: string]: string
  }
  using: string // key of content 
}

const box: Box = {
  content: {
    'something': 'inside'
  },
  using: 'something'
}

function showBox(box: Box) {
  console.log(box.content[box.using])
}

实际上content是一个对象来自另一个使用打字稿的包。如果可能,我不想包装类型。

为了帮助开发人员在编码过程中发现错误,我正在寻找是否有办法检查无效Box类型,例如:

const box: Box = {
  content: {
    'something': 'inside'
  },
  using: 'samething' // raise error when checking type
}

或者任何方式都可以让IDE的代码推荐知道using应该是content对象的键

我的代码目前看起来像这样,但这不是我想要的,我不知道要继续

interface Box {
  content: {
    [key: string]: string
  }
  using: keyof Box['content'] // will be string | number
}

感谢所有回复

尼基塔·伊万诺夫

您的解决方案实际上是正确的,但 IDE 无法为您提供任何建议,因为它keyof Box['content']被输入为任意字符串。如果你知道它content应该总是有一些特定的结构,你可以Box像这样把它放在描述中:

interface Box {
  content: {
    something: string;
  };
  // now it only allowed to be 'something', and IDE will suggest it
  using: keyof Box['content'];
}

如果你content的类型实际上是一个参数(意味着你可以有任意类型的框),你应该让它成为Box接口的参数,从而使它成为一个通用接口:

interface GenericBox<T> {
    content: T;
    using: keyof T;
}

现在你可以像这样使用它:

// simple example interface to fill a box
interface TestContent {
    x: string;
    y: number;
}

const genericBox: GenericBox<TestContent> = {
    content: {x: '', y: 0},
    using: 'x', // now it can be only 'x' or 'y', and IDE will suggest it
};

操场上看看

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

根据另一个对象的属性在对象中键入属性(在Typescript中)

在 TypeScript 接口中,是否可以将一个属性中的键限制为另一个属性的值?

Typescript接口从同一接口的另一个属性中设置属性的类型

Typescript-接口扩展了带有嵌套属性的另一个接口

根据TypeScript中的另一个属性值动态解析属性类型

有没有一种方法可以根据另一个属性(TypeScript)的值更改接口属性是否为可选?

具有另一个接口键的Typescript创建接口

在Typescript中,如果设置了另一个可选属性,如何使一个属性成为必需的?

TypeScript:如何根据另一个对象的类型有条件地创建一个类型所需的属性?

如何通过TypeScript中的装饰器获取另一个属性的值

具有来自另一个类的属性的严格子集的Typescript类

在 TypeScript 中创建一个具有函数和任意数量属性的接口

在Typescript中,如何定义具有确切数目的未知名称属性的类型

如何从Typescript中具有相同json对象结构的另一个数组更新数组中的json对象值

如何在 TypeScript 的另一个组件中键入占位符 React 元素?

如何在TypeScript中键入按名称包装另一个函数的函数

在TypeScript中从另一个接口的一个接口定义嵌套值?

如何在 Typescript 中将给定类型的所有属性转换为另一个类型?

如果在Typescript中输入另一个类属性,则如何将其声明为必选类?

属性在另一个对象中时如何将_.groupBy js用于组对象-TypeScript

具有一些已知和未知属性名称的对象的Typescript接口

具有属性的TypeScript接口

如何使用Typescript中另一个对象的键更新对象?

如何为对象的每个字段定义接口必须是TypeScript中另一个接口的实例?

TypeScript:我可以声明一个接口可以具有许多其他属性吗?

Typescript接口-是否可能需要“一个或另一个”属性?

Typescript-如何键入对象的未知属性?

当结构是动态的(未知)时,如何在 Typescript 中设置类型?

在Typescript中,当属性未知时如何键入对象?