【问题标题】:Is it possible to iterate all possible values in an interface property in TypeScript? [duplicate]是否可以在 TypeScript 的接口属性中迭代所有可能的值? [复制]
【发布时间】:2022-01-19 05:28:30
【问题描述】:

我想在接口属性定义中使用所有可能性,但找不到一种方法,只能手动键入它们。

// interface definition
interface Block {
    shape: 'square' | 'cycle' | 'triangle';
}
// I want to get a list of all shapes
const shapes: Block['shape'][] = ['square', 'cycle', 'triangle'];

我认为这是一个普遍的问题,我只是没有得到确切的关键字来搜索答案,请帮助。 非常感谢!

【问题讨论】:

  • TS 编译成 JS 时类型系统被擦除,这样 JS 看起来像const shapes = ['square', 'psycho', 'triangle']。这些字符串名称在 JS 中只出现一次;你不能删除它们。我在这里的建议是做与你所要求的相反的事情;定义shapes,然后根据它定义Block,如this。这对你有用吗?
  • 嗨@jcalz 感谢您的帮助!如果在 TS 中无法做到这一点,那我就放手吧。感谢您为我提供明确的答案。就我而言,我不能反过来做,因为类型定义是从 swagger api json 生成的,叹息。

标签: typescript typescript-generics


【解决方案1】:

接口仅用于编译时,因为 typescript 不支持它。

如果您可以在编译期间添加它并且您使用的是 TypeScript >= 2.4.1,您可以尝试此处建议的方式。

基本上,您应该添加 ts-transformer-keys 依赖项,自定义转换器,就像一个基本的一样,您将能够像这样列出属性:

import { keys } from 'ts-transformer-keys';

interface Props {
    id: string;
    name: string;
    age: number;
}
const keysOfProps = keys<Props>();

console.log(keysOfProps); // ['id', 'name', 'age']

【讨论】:

  • 因为 typescript 不支持它”:我猜你的意思是“TS 在运行时本身不支持迭代接口键,因为接口是转译时移除”
  • 这与我实际要求的不同。它更像是一个属性中的枚举,而不是接口,例如prop: 'A' | 'B' | 'C' 转换为 const p = ['A', 'B', 'C'];
猜你喜欢
  • 2018-01-22
  • 2010-09-27
  • 2017-09-02
  • 1970-01-01
  • 2017-02-04
  • 1970-01-01
  • 2018-02-07
  • 2013-02-24
  • 1970-01-01
相关资源
最近更新 更多