TypeScript如何使递归模板成为文本类型?

mw3dktmi  于 2023-02-17  发布在  TypeScript
关注(0)|答案(1)|浏览(133)

如何使递归模板为文本类型?

type MyType = 'A' | 'B' | 'C'
type MyTypesWithDot = `??` 
// (o) 'A.B' 'A.C' 'B.C' 'A.B.C' 'A.A.B'
// (o) 'A.A.A.A.B.B.A.C.{TOO MANY MyType}.A.B' ...
// (x) 'A.D' 'A..D' 'A.BB'

function myFunc(myArg: MyType) {
  // some code
}

我试着推断关键字,通用,一些其他的方式..但我不能:(

nuypyhwy

nuypyhwy1#

type MyTypesWithDot<T extends string> = T extends MyType
  ? T
  : T extends `${infer A}.${infer B}`
  ? `${MyTypesWithDot<A>}.${MyTypesWithDot<B>}`
  : never

function myFunc<T extends string>(myArg: MyTypesWithDot<T>) {
  // some code
}

该点通过以下方式应用递归检查

T extends `${infer A}.${infer B}` ? `${MyTypesWithDot<A>}.${MyTypesWithDot<B>}`: never

并使用T extends MyType来避免无限循环

相关问题