如何对只包含特定值的字符串进行类型检查。示例:const binary = '1010000101000';
我们知道二进制值用十进制表示只能是1 &0。为了更好地进行类型检查,对于这些类型的值,一个好的类型定义是什么呢?
type Binary = '0' | '1';
不能工作,因为这些只表示字符串的单个字符。但是这个想法是如何为整个字符串提供一个接口/类型,我们知道它只包含字符串中的某些类型的字符。
问题是不是选择界面二进制值,它是如何声明/定义预定义字符串值的类型。
您可以使用递归类型:
type BinDigit = "0" | "1"
type OnlyBinDigit<S> =
S extends ""
? unknown
: S extends `${BinDigit}${infer Tail}`
? OnlyBinDigit<Tail>
: never
function onlyBinDigit<S extends string>(s: S & OnlyBinDigit<S>) {
}
onlyBinDigit("01010101010011"); // OK
onlyBinDigit("010101012"); // NOK
解释一下这里的类型,OnlyBinDigit
是递归类型。
- Base case:空字符串返回类型
unknown
。 - 递归性:使用模板字面值,我们可以拆分字符串,并在尾部进行递归调用,直到我们到达空字符串。
- 在模板文字的非递归部分,如果第一个字符不匹配类型(这里是
'0' | '1'
),它将返回never
,因此类型检查失败。 游乐场