将JSON导入具有区分联合的接口

时间:2019-01-15 22:12:23

标签: typescript

我在将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" }
]

1 个答案:

答案 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[]等,而不是对象的文字。