Skip to content

a way to import from a module without including its globals #50424

Open
@DetachHead

Description

@DetachHead

Suggestion

🔍 Search Terms

import without global types

✅ Viability Checklist

My suggestion meets these guidelines:

  • This wouldn't be a breaking change in existing TypeScript/JavaScript code
  • This wouldn't change the runtime behavior of existing JavaScript code
  • This could be implemented without emitting different JS based on the types of the expressions
  • This isn't a runtime feature (e.g. library functionality, non-ECMAScript syntax with JavaScript output, new syntax sugar for JS, etc.)
  • This feature would agree with the rest of TypeScript's Design Goals.

⭐ Suggestion

it would be useful if there was a way to import from a module that has globally declared symbols, without importing those as well.

for example:

// node_modules/foo/main.d.ts
// i want to import some useful type from this 3rd party module, but it incorrectly assumes it will be run
// in an environment with `value` globally available
declare global {
    const value: string
    type GlobalFoo = {}
}
export type Foo = {}
// main.ts
// my module
import {Foo} from 'foo'
const foo: Foo = {}
const globalFoo: GlobalFoo = {} // no error
console.log(value) // no error

here, i only want to be able to use what i imported from the foo module. i don't want any of the globally declared stuff

i guess there are two parts to this feature request (or maybe only one of them is needed?):

1. a keyword on the import statement to prevent globals from being included in the import

import noglobals {Foo} from 'foo'

2. the ability to import globally declared types directly

if you want to be able to use them without importing all of the globals from the module into the global scope:

import type {GlobalFoo} from 'foo'

obviously, this should only be allowed for type imports, as it would otherwise fail at runtime

📃 Motivating Example

in playwright, the dom types are imported in order to support writing code that gets executed within the browser - see microsoft/playwright#3037. specifically, this is a workaround for #43434

however, there's no way to disable this without breaking everything - microsoft/playwright#16707

ideally, playwright should be able to import and use the dom types without incorrectly declaring globals like window to exist in the nodejs runtime

💻 Use Cases

i think there are countless examples in the wild of modules that incorrectly leak browser globals into node and vice versa. here are some recent examples i've come across:

Metadata

Metadata

Assignees

No one assigned

    Labels

    Awaiting More FeedbackThis means we'd like to hear from more people who would be helped by this featureSuggestionAn idea for TypeScript

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions