题目来源(type-challenges)
问题
type case1 = IsPalindrome<'abc'> // false
type case2 = IsPalindrome<'b'> // true
type case3 = IsPalindrome<'abca'> // false
type case4 = IsPalindrome<121> // true
type case5 = IsPalindrome<19260817> // false
解答
type Count<T extends string> = T extends `${infer Head}${infer Tail}` ? [Head, ...Count<Tail>] : []
type IsPalindrome1<T extends string | number> =
Count<`${T}`>['length'] extends 1
? true
: `${T}` extends `${infer Head}${infer C}${infer Tail}`
? Head extends Tail
? IsPalindrome<C>
: false
: false
type Reverse<T extends string> = T extends `${infer Head}${infer Tail}` ? `${Reverse<Tail>}${Head}` : T;
type IsPalindrome<T extends string | number> = `${T}` extends Reverse<`${T}`> ? true : false
拆分
- 数字拆分
- 拿出头尾字符进行比较
- 如果相等就拿剩下的字符递归比较
- 直到剩余长度为 1 返回结果
- 倒转对比