(据我所知)不可能为“任何不带逗号的字符串”编写类型。但是,如果预先知道该字符串,则可以创建一个条件类型来检查该字符串是否包含逗号。
type HasComma<S extends string, IfTrue = true, IfFalse = false> =
S extends `${string},${string}` ? IfTrue : IfFalse;
type A = HasComma<','> // true
type B = HasComma<'string'> // false
type C = HasComma<'[string, number]'> // true
因此,给定一个文字字符串,我们可以验证它并确保它是一个只有一个元素的元组。
type ValidateOneTuple<S extends string, IfValid = S, IfInvalid = never> =
HasComma<S, IfInvalid, S extends `[${string}]` ? IfValid : IfInvalid>
type A = ValidateOneTuple<'[string, number]'> // never
type B = ValidateOneTuple<'[string]'> // "[string]"
type C = ValidateOneTuple<'[str,ing]'> // never
Typescript Playground 链接 https://tsplay.dev/WP5b5w