TypeScript 中类似“string[7]”的含义是什么?

What is the meaning of something like `string[7]` in TypeScript?

今天在使用 TypeScript 时,我想将一个字段键入一个具有设置大小的字符串数组。虽然我知道如何在 TS 中实际执行此操作,但我的 C 直觉 让我写下:

interface MyInterface {
  arrayField: string[7];
  // ...
}

我注意到 linter 和编译器都没有对此抱怨,但似乎 arrayField 现在只是简单地键入 string。有人知道这里发生了什么吗?

我认为这是一个错误。我想应该是 string[].

虽然这个符号 string[7] 从 TS 的角度来看是有效的,但它没有任何意义。

string 只是一个原始类型。因为所有值都是 javascript 中的对象,string 类型也有一组允许的 methods/indexed 属性。

通俗地说javascript"abs"[0]returnsa。由于 TypeScript 没有 char 类型,它应该与 javascript 兼容。因此 string[10000] returns 只是一个 string.

在这里您可以找到 string 类型的所有内置属性:

type StringProperties= {
  [Prop in keyof string]: { key: Prop, value: string[Prop] }
}

How do we make a fixed length string in TS ?

仅在条件类型的帮助下。您应该遍历每个字符并将此字符放入数组中。然后你需要将数组的长度与预期的字符串长度进行比较。

参见示例:


type ToArray<T extends string, Cache extends readonly string[] = []> =
  T extends ''
  ? Cache
  : T extends `${infer A}${infer Rest}`
  ? ToArray<Rest, [...Cache, A]>
  : Cache

type IsValid<T extends string[], Len extends number> = T['length'] extends Len ? true : false

type IsLength<T extends string, Len extends number> = IsValid<ToArray<T>, Len> // ok

type Result1 = IsLength<'hello', 6> // false
type Result2 = IsLength<'hello', 5> // true

Playground

如果你对字符串验证技术感兴趣,可以阅读我的blog

固定长度很容易做到:

interface MyInterface {
  arrayField: [string, string, string, string, string, string, string];
}

嗯,这是可能的,但对于大整数来说,这是非常糟糕的。你可以写入开发工具简单的代码:

function array(length, type = "string") {
  return `[${Array(length).fill(type)}]`
}