microsoft / microsoft/TypeScript

[beta] Default imports behave as namespace imports for JSON modules with allowArbitraryExtensions

Ouverte
#52,863 0 commentaires 0 réactions 1 personne assignée Voir sur GitHub

@weswigham y travaille déjà.

Depuis le 25/2/2023.

Needs Investigation Rescheduled
Langage dominant
Go
Étoiles
111k
Forks
14.4k
Merge moyen
1 j 19 h
PR mergées (30 j)
117

Description

Bug Report

🔎 Search Terms

allowArbitraryExtensions, json modules, default import

🕗 Version & Regression Information

This is a problem with the new feature allowArbitraryExtensions in Typescript 5.0 beta.

⏯ Playground Link

This is a multi file issue so can't be replicated on the Playground.

💻 Code

TSconfig:

{
    "include": [
        "./**/*.ts",
        "./**/*.mts",
        "./**/*.cts",
        "./**/*.json"
    ],
    "exclude": [
        "./**/*.d.ts",
        "./**/*.d.mts",
        "./**/*.d.cts"
    ],
    "compilerOptions": {
        "composite": true,
        "declaration": true,
        "declarationMap": true,
        "downlevelIteration": true,
        "isolatedModules": true,
        "module": "NodeNext",
        "rootDir": "./",
        "sourceMap": true,
        "target": "esnext",
        "newLine": "lf",
        "useDefineForClassFields": true,
        "strict": true,
        "alwaysStrict": true,
        "exactOptionalPropertyTypes": true,
        "noImplicitOverride": true,
        "noUncheckedIndexedAccess": true,
        "importsNotUsedAsValues": "error",
        "forceConsistentCasingInFileNames": true,
        "allowArbitraryExtensions": true
    }
}

JSON file:

// mimeMap.json
{
    "text/javascript": ".js",
    "text/css": ".css",
    "text/html": ".html"
}

Declaration file for JSON:

// mimeMap.d.json.ts
declare const mimeMap: Record<string, string>;
export default mimeMap;

TS file:

import mimeMap from "./mimeMap.json" assert { type: "json" };

const mimeType = "some/mimetype";
const ext = mimeMap[mimeType];
🙁 Actual behavior

We get an error at mimeMap[mimeType]:

Element implicitly has an 'any' type because expression of type '"some/mimetype"' can't be used to index type 'typeof import("/home/jamesernator/projects/ts-issue/mimeMap.d.json", { assert: { "resolution-mode": "import" } })'.
  Property 'some/mimetype' does not exist on type 'typeof import("/home/jamesernator/projects/ts-issue/mimeMap.d.json", { assert: { "resolution-mode": "import" } })'.ts(7053)

This occurs because mimeMap has type { default: Record<string, string> } rather than just Record<string, string> as it should be.

🙂 Expected behavior

The JSON import should behave as a default import, not import the whole namespace as the default import. This worked correctly for other file types (other than .json) so I presume there is a conflict with the fact TS already has JSON module support (with resolveJsonModule).

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Évaluation

Cette issue n'a pas encore été évaluée.

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.