如何编写从另一种类型的键中去除前缀​​的 TypeScript 类型

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)

我意识到这可能是不可能做到的。

Ale*_*yne 6

如果您利用按键重新映射,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]原始前缀属性的值类型。

操场