microsoft / TypeScript

TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
https://www.typescriptlang.org
Apache License 2.0
100.18k stars 12.38k forks source link

Typescript fails to resolve module when type definitions are placed outside the root path (with typesVersions) #43133

Open pedrodurek opened 3 years ago

pedrodurek commented 3 years ago

Bug Report

If you have a project with embedded type definitions that are not in root path. i.e.: src/index.d.ts and src/ts4.1/index.d.ts, TypeScript fails to resolve this module when using the following approach:

  "types": "./src/index.d.ts",
  "typesVersions": {
    ">=4.1": {
      "*": [
        "src/ts4.1/*"
      ]
    }
  },

src/i18n/config.ts:4:34 - error TS2307: Cannot find module 'react-i18next' or its corresponding type declarations.

import { useTranslation } from 'react-i18next';

It works, if we replace * to index.d.ts, like this:

  "types": "./src/index.d.ts",
  "typesVersions": {
    ">=4.1": {
      "*": [
        "src/ts4.1/index.d.ts"
      ]
    }
  },

However, when we replace it with the actual file (src/ts4.1/index.d.ts), VS Code sometimes imports the module incorrectly, i.e.:

import { useTranslation } from 'react-i18next/*';

Rather than:

import { useTranslation } from 'react-i18next';

Here you can find some context.

šŸ’» Code

https://github.com/i18next/react-i18next/blob/master/package.json#L7

"types": "./src/index.d.ts",
"typesVersions": {
  ">=4.1": {
    "*": [
      "src/ts4.1/index.d.ts"
    ]
  }
},

šŸ™ Actual behavior

It fails to compile, and fails to auto-import properly.

import { useTranslation } from 'react-i18next/*';

šŸ™‚ Expected behavior

Resolve the module and import it properly.

import { useTranslation } from 'react-i18next';
ReDrUm commented 1 year ago

As a workaround, adding both * and an explicit index.d.ts seems to work for resolving root and nested entry point types for compilation and VSCode resolution:

"typesVersions": {
    ">=4.1": {
      "*": [
        "src/ts4.1/*",
        "src/ts4.1/index.d.ts"
      ]
    }
  },