我在将json导入使用已区分联合模式的接口时遇到问题。我在ts中将导入的json分配给类型变量时得到的错误消息是type: string
无法分配给type: "A"
。我了解它试图告诉我的内容,并且使用类型转换as Card[]
是一个简单的解决方法。我宁愿知道id,也可以在不进行强制转换的情况下正确解决此问题,以便打字稿可以正确检查导入的json。
以下是接口:
// cards.tsx
export type CardType = "A" | "B";
export interface BaseCard {
type: CardType;
name: string;
}
export interface ACard extends BaseCard {
type: "A";
foo: string;
}
export interface BCard extends BaseCard {
type: "B";
goo: string;
}
export type Card = ACard | BCard;
以下是给出错误的代码:
import { Card } from './cards.tsx';
import Cards from './cards.json';
const cards: Card[] = Cards;
示例json:
[
{ "type": "A", "name": "AName", "foo": "FOO" },
{ "type": "B", "name": "BName", "goo": "GOO" }
]
答案 0 :(得分:1)
我在ts中将导入的json分配给类型变量时得到的错误消息是:type:string无法分配给type:“ A”。我知道它试图告诉我什么,并且将类型强制转换用作Card []是一个简单的解决方法。
以下是错误的等效简化:
yield
如果不是json,则在创建时断言推断:
type Card = {
a:"A",
value: number
}
const failJSON = {
a: "A",
value: 123
}
const fail: Card = failJSON; // Error: type string not assingable to type "A"
但是,由于它是JSON文件,因此无法在其中添加断言。您唯一的选择就是按照您的判断断言type Card = {
a:"A",
value: number
}
const passJSON = {
a: "A" as "A", // NOTICE!
value: 123
}
const fail: Card = passJSON; // OK
。
TypeScript推断as Card[]
等,而不是对象的文字。