Как я могу использовать Typescript для моделирования объекта с помощью типа вместо интерфейса? - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть следующее JSON, которое я не могу контролировать:

{
    "date": "2020-01-01T00:00:00",
    "a": 0,
    "b": 0,
    "c": 0
}

Вместо указания интерфейса:

interface Foo {
    date: Date,
    "a": number,
    "b": number,
    "c": number
}

Я хочу быть в состоянии статически напечатать полезную нагрузку следующим образом:

type Age = "a";
type Salary = "b";
type Height = "c"

type Foo = Record<"date", Date> | Record<Age | Salary | Height, number>;

Несмотря на то, что компилятор выглядит счастливым, но когда я пытаюсь получить date от объекта, я получаю следующую ошибку:

const foo = {
        "date": "2020-01-01T00:00:00",
        "a": 0,
        "b": 0,
        "c": 0
    } as Foo;

Элемент неявно имеет тип 'any'.

Если я удалю Record<Age | Salary | Height, number>, то ошибка исчезнет.

1 Ответ

1 голос
/ 13 апреля 2020

Вы должны использовать пересечение вместо union :

type Foo = Record<"date", string> & Record<Age | Salary | Height, number>

Playground


** Я изменил тип date на string, потому что вы присваиваете строковое значение этому полю

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...