“提供的
Uppercase<T>
实用类型可以很容易地将文本转换为大写。”
type CasedIds<ID extends string> = {
id: ID,
upperID: Uppercase<ID>
}
const myObject: CasedIds<'my_id'> = {
id: 'my_id',
upperID: 'MY_ID',
} as const
查看游乐场
驼峰式大小写转换可能有些棘手。首先,您需要一个能够将字符串转换为驼峰式的类型。
可能有几种方法可以实现这一点。以下是其中一种方法。
type CamelCase<T extends string> =
T extends `${infer Pre}_${infer Letter}${infer Post}`
? `${Pre}${Capitalize<Letter>}${CamelCase<Post>}`
: T
type TestCamel = CamelCase<'abc_def_ghi'> // 'abcDefGhi'
查看游乐场
让我们来详细了解一下。
这个通用类型以字符串类型作为泛型参数T
。然后检查T
是否扩展了一个包含下划线后跟一些字符的特定模式的字符串。
如果是这样,那么从该模式推断出一些子字符串。将下划线前面的部分推断为
Pre
,将下划线后面的字符推断为
Letter
,将字符串的其余部分推断为
Post
。否则,就直接使用字符串类型。
然后我们可以从
Pre
和
Letter
大写以及
Post
中制作一个新字符串。但可能会有更多的下划线,因此我们在
Post
上再次执行整个过程。这是一种递归类型,在没有下划线剩余时停止递归。
使用它,其余的就很容易了:
type CamelCase<T extends string> =
T extends `${infer Pre}_${infer Letter}${infer Post}`
? `${Pre}${Capitalize<Letter>}${CamelCase<Post>}`
: T
type CasedIds<ID extends string> = {
id: ID,
upperID: Uppercase<ID>
camelID: CamelCase<ID>
}
const myObject: CasedIds<'my_id'> = {
id: 'my_id',
upperID: 'MY_ID',
camelID: 'myId',
} as const
查看游乐场
尽管你可能希望有一个函数来为你构建它们:
function makeId<T extends string>(id: T): CasedIds<T> {
return {} as unknown as CasedIds<T> // mock a real implementation
}
const myId = makeId('my_id')
myId.id // type: 'my_id'
myId.upperID // type: 'MY_ID'
myId.camelID // type: 'myId'
看操场