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 的变量
