Typescript 类型字面值字符串首字母大写是为什么这样实现的?

代码如下

type MyCapitalize<S extends string> = S extends `${infer R}${infer T}`
  ? `${Uppercase<R>}${T}`
  : ""

让我想不明白的地方是, 为什么TS能推断出 R 代表首字母, 而 T 代表剩余的字符


额外, 我还有一个问题, 就是Exclude,是T,U被迭代了吗?

//T 和 U 都是Tuple
type MyExclude<T, U> = T extends U ? never : T

Ts的类型操控有的很直观, 也很优雅, 但是有的又很看不懂

希望大佬帮忙看下, 如果有好的参考资料可以分享下

阅读 1.9k
1 个回答

首先第一个问题
它会按照顺序依次放入变量, 类似于扩展运算符, 只是不需要你自己写...
如果用js的语法来描述他的话其实就类似于这样

// `${infer R}${infer T}`
const [R, ...T] = 'hello'
/**
* R : h
* T : ello
*/

如果你愿意在它的基础上再加一个变量就会发现这个的
类似于这样

type MyCapitalize<S extends string> = S extends `${infer R}${infer T}${infer D}`
  ? `${Uppercase<R>}${T}`
  : ""
const a: MyCapitalize<"hello"> = "He"

这时候你会发现这个type变成了指向He了, T自动使用了他的第二个值

第二个问题没太看懂想问什么, 抱歉

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Microsoft
子站问答
访问
宣传栏