网站搜索

typescript - 如何解析模板字符串字面量类型以获取组成部分


也许不使用 as:我该如何

type F = 'a' | 'b' | 'c'

type R = '11' | '22' | '33'

type P = `${F}${R}`


const p: P = `a11`

// is there a better way to parse this string?
function getFR(p: P): [F, R] {
  return [p[0] as F, p.slice(1) as R]
}

console.log(getFR(p))

答案#1

对于 TypeScript 特定的解决方案,如果你愿意将字符串用作 类型 而不是值,你可以在模板字面量中使用 infer(参见“我们可以从替换位置推断”的部分),例如:

type F = 'a' | 'b' | 'c'

type R = '11' | '22' | '33'

type P = `${F}${R}`

type ExtractFR<T extends P> = T extends `${infer f extends F}${infer r extends R}` ? [f, r] : never;

type fr = ExtractFR<'a11'> // ['a', '11']

操场

答案#2

这就是我会做的方法。

www.typescriptlang.org

type F = 'a' | 'b' | 'c'

type R = '11' | '22' | '33'

type P = `${F}${R}`

const p: P = `a11`

const extract = <T extends P>(p: T): [F,R] => {
   const data: any = [p[0], p.slice(1)];
   return data;
}


console.log(extract("a11"))

如上所示,你不必指定任何类型转换,因为方法返回 :[F,R] 会自动转换数据。不过,你仍然需要创建一个类型为 any 的变量