如何解决 topojson 包的打字稿错误?

tur*_*tle 1 typescript topojson

请原谅这个幼稚的问题;我是打字稿的新手。在 javascript 中,我可以使用topojson.mesh创建一个像这样的网格对象:

import us from "./counties-albers-10m.json"
topojson.mesh(us, us.objects.states, (a, b) => a !== b))
Run Code Online (Sandbox Code Playgroud)

当我尝试在 Typescript 中执行此操作时,我收到此警告:

Types of property 'type' are incompatible. Type 'string' is not assignable to type "Topology" TS2345
Run Code Online (Sandbox Code Playgroud)

我也@types/topojson安装了。谁能帮我调试一下?我对打字稿的了解不够,无法理解问题所在。

更广泛地说,如何调试这样的错误?我发现 3rd 方包存在各种类型问题,并且在许多情况下不知道如何为我的 javascript 对象分配正确的类型。谢谢您的帮助。

nii*_*oah 5

安装后,@types/topojson我可以topojson-specification像这样导入所需的类型:

import * as topojson from 'topojson-client';
import { GeometryObject, Topology } from 'topojson-specification';
import us from '../counties-albers-10m.json';

topojson.mesh(
  (us as unknown) as Topology,
  us.objects.states as GeometryObject,
  (a: GeometryObject, b: GeometryObject) => a !== b
);
Run Code Online (Sandbox Code Playgroud)

更广泛地说,如何调试这样的错误?

为了调试这种事情,我使用我的 IDE(VS Code)来检查方法,比如.mesh方法并查看它期望的类型。我还使用Go To Definition功能(?+ 在 Mac 上单击)来查看类型定义: 在此处输入图片说明

转到类型定义文件还向我展示了他们从何处导入类型。

有一部分我想不通。当您在 TypeScript 中导入 JSON 时,它会自动推断类型,但由于多种@types/topojson原因(例如number[] !== [number, number]),这些自动类型似乎与那些冲突。这就是为什么我需要unknown在转换为正确类型之前先转换为。这可能不是最佳解决方案,但我不知道描述 JSON 文件类型的方法。