在 TypeScript 中更改导入的 JSON 的类型

Ale*_*ich 10 import json typescript

当在启用该选项的 TypeScript 项目中导入 JSON 文件时,resolveJsonModuleTypeScript 编译器能够自动推断导入的 JSON 文件的类型。但是,这种类型太具体了,我想用更通用的类型替换它。我尝试通过编写自定义类型定义文件来做到这一点:

// file modules.d.ts

declare module "*.json" {
  const value: Record<string, string>;
  export default value;
}
Run Code Online (Sandbox Code Playgroud)

但 TypeScript 编译器会忽略这个定义。

对我有用的唯一方法是使用临时变量,如下所示:

import DATA_JSON from "./data.json";

const DATA  = DATA_JSON as Record<string, string>; // Use my own type instead of the inferred one.

export { DATA };

Run Code Online (Sandbox Code Playgroud)

但这很无聊。有没有其他方法可以将我自己的类型赋予 TypeScript 中导入的 JSON 文件?

kuu*_*son -3

你可以尝试使用映射类型。不确定您想要实现什么结构/类型,但我相信这是要走的路。

拥有这样的要求听起来像是开始探索高级 TS 的好时机(我推荐yt 上的Matt Pocock

import DATA_JSON from './data.json';

const OWN_TYPED_DATA_JSON = DATA_JSON as unknown as {
   [key in keyof typeof DATA_JSON]: {
      [nestedKey in keyof typeof DATA_JSON[key]]: {
         [moreNestedKey in keyof typeof DATA_JSON[key][nestedKey]]: string
      }
   }
}
Run Code Online (Sandbox Code Playgroud)