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

ale*_*nco 6 javascript types typescript

有什么方法可以在 TypeScript 中定义这种类型吗?就像是:

type lowercaseWord = /[a-z]/
Run Code Online (Sandbox Code Playgroud)

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

jca*_*alz 12

(在这里为后代记录,尽管问题略有不同并且要求[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+
Run Code Online (Sandbox Code Playgroud)

Playground 代码链接


cap*_*ian 6

是和不是。有内置 int (内在)类型LowerCase,但它作为实用程序类型工作。它作为正则表达式工作String.prototype.toLowerCase,而不是作为正则表达式。参见示例:

type Result = Lowercase<'A'> // 'a'
Run Code Online (Sandbox Code Playgroud)

操场

在这里您可以找到更多类型: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
Run Code Online (Sandbox Code Playgroud)

请记住

const x: Lowercase<string> = 'A' // no error
Run Code Online (Sandbox Code Playgroud)

不会触发错误