如何对我们知道仅包含某些值的字符串进行类型检查。
例子: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
是递归类型。
- 基本情况:空字符串返回类型
unknown
.
- 递归性:使用模板文字,我们可以分割字符串并在尾部进行递归调用,直到到达空字符串。
- 在非递归部分,模板文字,如果第一个字符与类型不匹配(这里
'0' | '1'
),它将返回never
从而导致类型检查失败。
操场
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)