本篇是**「一起学习** TypeScript **」**系列的第5篇,接下来笔者将持续深耕,不定时更新一系列精彩纷呈的TypeScript文章,旨在解答使用TypeScript过程中的各种疑难杂症,一起探索TS的无穷魅力!
【TS系列回顾】:
TS系列(1): React中能否使子组件实现“类型安全”?
一、问题:process.env变量类型会自动补全吗?
TS中一个常见的问题是:process.env不会为你系统中实际存在的环境变量提供自动补全功能。
而且,当你将其传递给一个期望string类型的函数时,他们最终会被标注为:string|undefined,真是令人头大😅
针对这种情况,通常有以下几种解决方案:
二、解决方案
方案1:增强全局类型
你可以补全全局类型NodeJS.ProcessEnv,在其中补上你的环境变量:
//global.d.ts
namespace NodeJS {
interface ProcessEnv {
MY_ENV_VARIABLE: string;
}
}
这种做法其实是依赖于全局interface: NodeJS.ProcessEnv的声明合并,你在其中添加上一个额外的属性MY_ENV_VARIABLE。现在你再使用该全局变量,会发现它可以被顺利推断为string类型😉:
适用场景:这种解决方案适合于环境变量较少,或无法添加额外的库来检查的情况。
方案2:在运行时使用 t3-env 进行验证
如果你想验证所有的环境变量在运行时是否存在,可以使用t3-env等库。
下面是一个简单的例子🌰:
import { createEnv } from "@t3-oss/env-core";
import { z } from "zod";
export const env = createEnv({
server: {
DATABASE_URL: z.string().url(),
OPEN_AI_API_KEY: z.string().min(1),
},
clientPrefix: "PUBLIC_",
client: {
PUBLIC_CLERK_PUBLISHABLE_KEY: z.string().min(1),
},
runtimeEnv: process.env,
});
你可以利用 Zod 强大的验证功能,例如字符串的 .url() 或 .min(1)。
它还为你的环境变量提供了env。这意味着你可以在整个代码库中使用 env,并且将获得环境变量的自动完成和类型检查。
关于t3-env更详细用法,可参考:env.t3.gg/docs/core
总结
- 如果你的项目很小,并且不想添加额外的依赖项,你可以选择增强全局类型
- 如果你担心运行时缺少环境变量,
t3-env是个不错的选择