是否可以在 Typescript 中声明动态字符串类型

Exi*_*ong 2 typescript

认为:

export enum EEnv { devint, qa1 };
export type TEnv = keyof typeof EEnv;
export const env:Record<TEnv, {something:number}> = {
  devint: {
    something: 1,
  },
  qa1: {
    something: 1,
  },
}
Run Code Online (Sandbox Code Playgroud)

然后我想基于env对象创建动态对象,如下所示:

export const SAVE_TOKEN: Record<TEnv, string> = {
  devint: "SAVE_TOKEN/devint", // based on "env" key
  qa1: "SAVE_TOKEN/qa1", // based on "env" key
}
Run Code Online (Sandbox Code Playgroud)

有什么方法可以创建字符串类型"SAVE_TOKEN/"+TEnv而不是字符串类型。

Spe*_*ark 6

为那些仍然在这里找到方法的人更新:这将在 4.1 中添加,请参阅TypeScript#40336

export type SaveTokenNamespace<K extends string> = { [T in K]: `SAVE_TOKEN/${T}` };

export function makeNamespace<K extends TEnv>(env: Record<K, unknown>): SaveTokenNamespace<K> {
  return Object.keys(env).reduce((ns, k) => ({ ...ns, [k]: `SAVE_TOKEN/${k}` }), {} as SaveTokenNamespace<K>);
}

console.log(makeNamespace(env));
const envNamespace = makeNamespace(env);
const test1: 'SAVE_TOKEN/qa1' = envNamespace.qa1; // Ok!
const test2: 'SAVE_TOKEN/notqa1' = envNamespace.qa1; // Error: Type '"SAVE_TOKEN/qa1"' is not assignable to type '"SAVE_TOKEN/notqa1"'.
Run Code Online (Sandbox Code Playgroud)

在 TypeScript 游乐场尝试一下


有一些流行的公开提案/请求,包括Regex 验证的字符串类型:TypeScript#6579TypeScript#12754,并附有关于这个确切用例评论,但从 3.5.1 开始,答案是否定的。