import.meta.env 的打字稿类型

Posted

技术标签:

【中文标题】import.meta.env 的打字稿类型【英文标题】:Typescript Types for import.meta.env 【发布时间】:2021-05-08 10:01:06 【问题描述】:

我现在正在使用将环境变量注入import.meta.env 的框架(vite)。

我之前能够创建一个文件env.d.ts 来为process.env 提供类型

declare global 
  namespace NodeJS 
    interface ProcessEnv 
      GITHUB_AUTH_TOKEN: string;
      NODE_ENV: 'development' | 'production';
      PORT?: string;
      PWD: string;
    
  

我尝试了以下方法但不起作用。

declare global 
  namespace NodeJS 
    interface ImportMeta 
      GITHUB_AUTH_TOKEN: string;
      NODE_ENV: 'development' | 'production';
      PORT?: string;
      PWD: string;
    
  

【问题讨论】:

【参考方案1】:

我也遇到过类似的问题,解决了

tsconfig.json


  ...
  "compilerOptions": 
    ...
    "target": "ESNext",
    "types": ["vite/client"]
  

vite 安装为开发依赖项。

【讨论】:

可以确认这在 vite/laravel 安装中对我有用。 可能是干净的解决方案 :) 谢谢队友【参考方案2】:

记录在这里:https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-9.html#support-for-importmeta

所以你快到了:

interface ImportMeta 
  env: 
    GITHUB_AUTH_TOKEN: string;
    NODE_ENV: 'development' | 'production';
    PORT?: string;
    PWD: string;
  ;

但请注意,在 vite 中,所有环境变量都必须以 VITE_ 为前缀,因此这些环境变量在应用程序中均不可用。

【讨论】:

我收到 ts 错误,我不确定如何修复 - All declarations of 'env' must have identical modifiers. 有趣,它对我有用,但我仍在使用 vite 1.0,也许这随着新的 vite 2.0 版本而改变(我实际上很确定这可能是问题:github.com/vitejs/vite/blob/… )?【参考方案3】:

我通过以下方式让它工作 -

interface ImportMetaEnv 
  VITE_PORT?: string;
  VITE_AUTH_TOKEN?: string;

【讨论】:

你能解释一下吗?比如 env.d.ts 是如何提供给 process.env 的,你只是创建文件还是必须告诉 vite 将它加载到某个地方?跨度> @mentorgashi 只需要.d.ts 文件。无需配置vite【参考方案4】:

如果您使用的是 SvelteKit v1.0.0-next.120 和 Vite 2.4.0,env 必须是 global.d.ts 中 ImportMeta 的属性。这是一个例子:

interface ImportMeta 
  env: 
    VITE_DATABASE_URL?: string
    VITE_WEB_URL?: string
    VITE_BRAINTREE_GATEWAY?: string
    VITE_BRAINTREE_DESCRIPTOR?: string
    VITE_RECAPTCHA_SECRET_KEY?: string
    VITE_EMAIL_FROM?: string
    VITE_EMAIL_ADMINS?: string
    VITE_SEND_IN_BLUE_KEY?: string
    VITE_SEND_IN_BLUE_URL?: string
    VITE_RECAPTCHA_SITE_KEY?: string
  

【讨论】:

【参考方案5】:

根据https://vitejs.dev/guide/env-and-mode.html#intellisense 此处的文档,您可以执行以下操作:

// env.d.ts
interface ImportMetaEnv extends Readonly<Record<string, string>> 
  readonly VITE_APP_TITLE: string
  // more env variables...


interface ImportMeta 
  readonly env: ImportMetaEnv

【讨论】:

以上是关于import.meta.env 的打字稿类型的主要内容,如果未能解决你的问题,请参考以下文章

打字稿'条件'类型

通用类型(T)与打字稿中的任何类型有啥区别

打字稿中的通用对象类型

打字稿中的全局类型

打字稿条件类型内部类型

强类型的打字稿集合