Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: type unknown env as any #7702

Merged
merged 1 commit into from Apr 12, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/guide/env-and-mode.md
Expand Up @@ -42,7 +42,7 @@ In addition, environment variables that already exist when Vite is executed have
`.env` files are loaded at the start of Vite. Restart the server after making changes.
:::

Loaded env variables are also exposed to your client source code via `import.meta.env`.
Loaded env variables are also exposed to your client source code via `import.meta.env` as strings.

To prevent accidentally leaking env variables to the client, only variables prefixed with `VITE_` are exposed to your Vite-processed code. e.g. the following file:

Expand Down
2 changes: 1 addition & 1 deletion packages/vite/types/importMeta.d.ts
Expand Up @@ -36,7 +36,7 @@ interface ImportMeta {
}

interface ImportMetaEnv {
[key: string]: string | boolean | undefined
[key: string]: any
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How about adding this line? (in addition to this change)

Suggested change
[key: string]: any
[key: string]: any
[env: `VITE_${string}`]: string

It requires template literal types support which is implemented in TypeScript 4.1+ (released 2020/11).

This type will work like below.

/// <reference types="vite/client" />

interface ImportMetaEnv {
  VITE_FOO: string
  VITE_BAR: 'aa' | 'bbb'
  VITE_AA: number // error "this should be string" here
}
import.meta.env.VITE_BAR // 'aaa' | 'bbb'
import.meta.env.VITE_VAL // string

One thing to consider is that you can't define variables that are not string types starting with VITE with define.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One thing to consider is that you can't define variables that are not string types starting with VITE with define.

Yeah I think that's the issue from #6637 that people want to type it as boolean or number, but it was actually a string. And if they really want it to actually be a boolean/number, they have to use define for it. Not sure how common this is needed though, but your suggestion could be breaking some setups (though quite neat).

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we should merge this PR in its current form for 2.9. And then, @sapphi-red maybe you could create another PR with your proposal and justify the Typescript version requirement, and we target 3.0 for the change?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure. I will create a PR with more details.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh there is a envPrefix option. It is impossible to do this approach.

BASE_URL: string
MODE: string
DEV: boolean
Expand Down