Может кто-нибудь помочь мне отладить это?
Ошибка в основном говорит:
Свойство type
вашего переданного в us
объекта литерал от "./counties-albers-10m.json"
имеет тип string
, но от @types/topojson
ожидается, что будет строковым литералом типа "Topology"
, который более специфичен c, чем расширенный string
, Например, вы не можете сделать это:
const wideString: string = "something"
const stringLiteral: "Topology" = wideString // error, string not assignable to type "Topology"
При проверке набора для mesh
и его первого аргумента функции topology
с типом Topology
, вы действительно могу видеть, что типы в точности соответствуют определенным выше.
Так почему же это так? Давайте возьмем простой JSON файл:
{ "a": "foo", "b": 42 }
При импорте этого файла с import us from "./counties-albers-10m.json"
тип us
на самом деле:
type US = typeof us; // type US = { a: string; b: number; }
TypeScript расширяет типы литералов свойств, выведенные из файла JSON : "foo"
становится string
и 42
становится number
соответственно. Это поведение преднамеренное , но есть также запрос функции, запрашивающий большую гибкость с as const
, чтобы дать вам узкий, точный тип.
Решение
Используйте утверждение типа (as
), чтобы преобразовать импортированный объект us
в Topology
или в пользовательский тип.
import { Topology } from "topojson-specification" // needed type for mesh API
// alternatively use a custom compatible json type
import us_ from "./counties-albers-10m.json"
const us: Topology = us_ as Topology;
topojson.mesh(us, ...) // this should work now
как отлаживать ошибки, подобные этой ?
Сообщение об ошибке было довольно информативным, я думаю, вы просто не знали о строковых литеральных типах и / или расширении JSON. В общем, вы также можете заглянуть в третьи типы библиотек с помощью IDE, такой как VS Code, чтобы увидеть, какая форма ожидается.