定义采用小写单词的 TypeScript 类型

问题描述 投票:0回答:3

有什么方法可以在 TypeScript 中定义这种类型吗?比如:

type lowercaseWord = /[a-z]/

但是这定义了一个字符串? (我认为上面的代码将定义一个正则表达式。)

javascript typescript types
3个回答
15
投票

(在这里为后代记录,尽管问题略有不同并要求

[a-z]

从 TypeScript 4.8 开始,现在支持使用 内部字符串操作类型 以及

string
等宽类型。 这是在 microsoft/TypeScript#47050 中实现的,但在 TS 4.8 发行说明中没有提及。

所以现在,

Lowercase<string>
仅对应于小写字符串(在
.toLowerCase()
之后保持不变的字符串),而在TypeScript 4.7及更低版本中它可以匹配任何
string

let str: Lowercase<string>;
str = "abc"; // okay
str = "DEF"; // error in TS4.8+

Playground 代码链接


6
投票

是和不是。有内置 int (内在)类型

LowerCase
但它作为实用程序类型工作。它的工作原理是
String.prototype.toLowerCase
而不是正则表达式。 参见示例:

type Result = Lowercase<'A'> // 'a'

游乐场

在这里您可以找到更多类型:

Capitalize
Uncapitalize
Lowercase
Uppercase

如果您想应用此类限制,可以在函数中执行:

type UpLetters = 'A' | 'B' | 'C' // provide all allowed letters
type LowLetters = Lowercase<UpLetters>

type Letters = UpLetters | LowLetters

type IsAllowed<T extends string> = T extends Letters ? T extends Lowercase<T> ? T : never : never

const lower = <T extends string>(str: IsAllowed<T>) => null

/**
 * Ok
 */
lower('a') // ok

/**
 * Error
 */
lower('A') // error
lower('1') // error
lower('$%^') // error

请记住

const x: Lowercase<string> = 'A' // no error

不会触发错误


0
投票

其他答案并没有直接回答OP的问题。我的可读性解决方案是创建一个辅助类型函数

Split
,然后简单地将所有小写字母作为字符串文字传递:

type Split<T extends string> = T extends `${infer Head}${infer Tail}`
    ? Head | Split<Tail>
    : never;

type LowerLetter = Split<"abcdefghijklmnopqrstuvwxyz">;

就我而言,我想要所有字母数字字母,所以我这样做了:

type Numeric = Split<"0123456789">;
type LowerLetter = Split<"abcdefghijklmnopqrstuvwxyz">;
type UpperLetter = Uppercase<LowerLetter>;
type AlphaNumeric = Numeric | LowerLetter | UpperLetter;
© www.soinside.com 2019 - 2024. All rights reserved.