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

use*_*882 18 typescript

例如,长度只能为两个字符的字符串,可用于 ISO 国家/地区代码。

我使用过谷歌并查看了文档,但找不到答案。

Rya*_*ugh 13

没有办法将字符串长度指定为类型。

如果您有一个有限的国家/地区代码列表,您可以编写一个字符串文字类型:

type CountryCode = 'US' | 'CN' | 'CA' | ...(lots of others);
Run Code Online (Sandbox Code Playgroud)

  • 我想过做类似的事情,但使用 https://www.npmjs.com/package/country-data,但我决定反对它,因为考虑到国家/地区代码将从后端 API 返回,这有点矫枉过正。我只是想确保变量不能包含任何明显错误的数据,并且认为指定长度很简单。我也考虑过使用数组,但认为这有点复杂,而且您显然无法指定数组的强制最大长度(/sf/ask/2879783441/) (2认同)

vye*_*nkv 13

实际上是可以做到的

// tail-end recursive approach: returns the type itself to reuse stack of previous call
type LengthOfString<
  S extends string,
  Acc extends 0[] = []
> = S extends `${string}${infer $Rest}`
  ? LengthOfString<$Rest, [...Acc, 0]>
  : Acc["length"];

type IsStringOfLength<S extends string, Length extends number> = LengthOfString<S> extends Length ? true : false

type ValidExample = IsStringOfLength<'json', 4>
type InvalidExapmple = IsStringOfLength<'xml', 4> 
Run Code Online (Sandbox Code Playgroud)

谢谢


cdi*_*las 5

您可以使用类型构造函数和幻像类型来实现此目的,这是一些值得学习的有趣技术。你可以在这里看到我对类似问题的回答