【问题标题】:Static typing with JSON and TypeScript使用 JSON 和 TypeScript 进行静态类型化
【发布时间】:2018-10-15 07:33:23
【问题描述】:

假设我有这个 JSON 文件:

{
  "foo": 1,
  "bar": true,
  "baz": "yes"
}

有没有办法导入该文件并使用 TypeScript 获得静态类型?

使用普通的 Node.js,我们可以:

const json = require('./file.json');

但是有了TS,有没有办法:

import json = require('./file.json');

有没有办法像这样获得静态类型?应该很容易吧?

IMO,你应该能够做到

typeof 'path/to/json/file.json'

那就是:

export type MyInterface = typeof 'path/to/json/file.json'

这会给你一个类型。

【问题讨论】:

  • 为什么不直接创建一个接口,然后在收到请求响应后断言类型? stackoverflow.com/questions/22875636/…
  • 使用接口很不方便,您的接口必须不断更新 JSON,反之亦然。
  • True...所以您的编辑建议应该有一些内置的方法来生成临时接口?不错的主意
  • 那么你就不需要生成界面了。 TS 接口是静态的,JSON 也是。为什么不能使用 JSON 本身作为接口。它有一个名称 - JSON 文件的文件路径就是名称。
  • 我将此升级为功能请求,因为我不希望得到我正在寻找的答案:github.com/Microsoft/TypeScript/issues/23895

标签: json node.js typescript typescript2.0


【解决方案1】:

您基本上可以执行与标准 Node.js 相同的操作,但使用 interface 并将其附加到您要使用 require 的变量。

interface File {
  foo: number
  bar: boolean
  baz: string
}

const jsonFile: File = require('./file.json')

如果从文件中读取和解析的数据不符合接口,TS应该会报错。

目前没有动态分析未读 JSON 文件以获取其类型的方法。

【讨论】:

  • 是的,这行得通,所以我投了赞成票,但这完全是重复劳动,并最大限度地打破了 DRY 原则。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-08
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多