Typescript - type检查字符串是否只包含特定字符



如何对只包含特定值的字符串进行类型检查。示例: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,因此类型检查失败。
  • 游乐场

相关内容

  • 没有找到相关文章

最新更新