特定字符串值的打字稿数组

Posted

技术标签:

【中文标题】特定字符串值的打字稿数组【英文标题】:typescript array of specific string values 【发布时间】:2019-12-07 09:33:36 【问题描述】:

我有一个数组

const relations = ['profiles', 'locations', 'change_history']

如果我想创建一个类似的界面

interface IParams 
  id: number;
  relations: []string; // how to make this an array of those relations above?

我该怎么做?

【问题讨论】:

string[] 怎么样?还是您在寻找更具体的东西?比如['profiles', 'locations', 'change_history']本身 寻找特定的东西。谢谢 TypeScript array to string literal type的可能重复 【参考方案1】:

你可以:

enum Relation 
    profiles: 'profiles', locations: 'locations', change_history: 'change_history'


interface IParams 
  id: number;
  relations: Relation[];

【讨论】:

运行时的值将是数字! typescriptlang.org/docs/handbook/enums.html【参考方案2】:

这里基本上有两种选择:

const string enum

https://www.typescriptlang.org/docs/handbook/enums.html#string-enums(用于在运行时检查字符串值) https://www.typescriptlang.org/docs/handbook/enums.html#const-enums(避免一些关于枚举的开销,并用字符串文字替换代码中对它们的引用)

您可以通过以下方式定义一个常量枚举:

const enum Relation 
  profiles = 'profiles', 
  locations = 'locations', 
  change_history = 'change_history'


字符串文字类型

https://www.typescriptlang.org/docs/handbook/advanced-types.html#string-literal-types
type Relation = 'profiles' | 'locations' | 'change_history';

就像@guijob 已经指出的那样,这将是您的界面(在这两种情况下):

interface IParams 
  id: number;
  relations: Relation[];

当然你也可以内联这个字符串字面量类型定义

relations: ('profiles' | 'locations' | 'change_history')[];

但请注意,在运行时不会检查值!

因此,如果您从在编译时未检查的资源(如 API 或用户输入)添加数据,则无法保证仅存在这些值。

【讨论】:

【参考方案3】:

您可以使用as const assertions 轻松输入“关系”

const relations = ['profiles', 'locations', 'change_history'] as const

interface IParams 
  id: number;
  relations: typeof relations;

作为替代方案,您可以使用Array<T>

interface IParams 
  id: number;
  relations: Array<'profiles' | 'locations' | 'change_history'>

或者如果您更喜欢其他语法

interface IParams 
  id: number;
  relations: ('profiles' | 'locations' | 'change_history')[]

【讨论】:

以上是关于特定字符串值的打字稿数组的主要内容,如果未能解决你的问题,请参考以下文章

打字稿循环遍历具有索引和值的字符串

打字稿:`| 的含义[T]`-用于数组中元素成员资格的编译时检查的约束

如何使用打字稿声明具有特定长度的字符串?

打字稿 |从对象 T 中提取具有类型 K 值的所有键名

两个布尔值的打字稿元组被推断为布尔类型的数组

接受通用参数和字符串数组的打字稿函数