有什么方法可以在 TypeScript 中定义这种类型吗?比如:
type lowercaseWord = /[a-z]/
但是这定义了一个字符串? (我认为上面的代码将定义一个正则表达式。)
(在这里为后代记录,尽管问题略有不同并要求
[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+
是和不是。有内置 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
不会触发错误
其他答案并没有直接回答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;