sjm*_*ett 1 typescript template-literals
我正在尝试编写一种类型,可以从另一种类型的键中删除给定的前缀。
我尝试过以下代码:
type StripPrefix<
TPrefix extends string,
T extends `${TPrefix}.${string}`,
> = T extends `${TPrefix}.${infer R}` ? R : never;
type MapKeysStripPrefix<T, TPrefix extends string> = {
[K in StripPrefix<TPrefix, keyof T & `${TPrefix}.${string}`>]: Pick<
T,
keyof T & `${TPrefix}.${string}`
>[`${TPrefix}.${K}`];
};
type test = {
'test.blah': 1;
'test.foo': 2;
'bar.baz': 3;
};
type result = MapKeysStripPrefix<test, 'test'>;
Run Code Online (Sandbox Code Playgroud)
但我收到一个错误:
Type '`${TPrefix}.${K}`' cannot be used to index type 'Pick<T, keyof T & `${TPrefix}.${string}`>'
Run Code Online (Sandbox Code Playgroud)
我意识到这可能是不可能做到的。
如果您利用按键重新映射,as那么这会容易得多:
type StripPrefix<
TPrefix extends string,
T extends string, // changed this constraint to string
> = T extends `${TPrefix}.${infer R}` ? R : never;
type MapKeysStripPrefix<T, TPrefix extends string> = {
[K in keyof T & string as StripPrefix<TPrefix, K>]: T[K];
};
Run Code Online (Sandbox Code Playgroud)
T在这里,我们映射与相交的键,string以确保我们只有字符串键。然后重命名那些将as返回StripPrefix<TPrefix, K>无前缀字符串的字符串,或者通过返回将其从结果中删除never。
值类型就是T[K]原始前缀属性的值类型。
| 归档时间: |
|
| 查看次数: |
836 次 |
| 最近记录: |