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

3

假设:

export enum EEnv { devint, qa1 };
export type TEnv = keyof typeof EEnv;
export const env:Record<TEnv, {something:number}> = {
  devint: {
    something: 1,
  },
  qa1: {
    something: 1,
  },
}

然后,我想基于env对象创建动态对象,就像这样:
export const SAVE_TOKEN: Record<TEnv, string> = {
  devint: "SAVE_TOKEN/devint", // based on "env" key
  qa1: "SAVE_TOKEN/qa1", // based on "env" key
}

有没有一种方法可以创建字符串类型为 "SAVE_TOKEN/"+TEnv,而不仅仅是一个普通的字符串。

如果您正在使用像Angular这样的框架,那么这已经内置了。如果没有,请查看https://webpack.js.org/。有关使用环境变量的基本示例的教程:https://medium.com/@justintulk/passing-environment-variables-into-your-code-with-webpack-cab09d8974b0 - mwilson
1个回答

7

对于那些仍然找到这里的人,更新:这将在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"'.

在 TypeScript playground 中试一试


有一些流行的开放提议/请求,包括正则表达式验证字符串类型:TypeScript#6579TypeScript#12754,并附有关于这个确切用例的评论,但截至3.5.1,答案是否定的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接