Вывести интерфейс объекта в TypeScript - PullRequest
0 голосов
/ 27 июня 2019

Предположим, у меня есть интерфейс TypeScript в модуле, а также функция, которая возвращает инициализированный объект этого интерфейса:

export default interface Foo {
    name: string;
    surname: string;
    cars: number;
};

export function newFoo(): foo {
    return <Foo>{
        name: '',
        surname: '',
        cars: 0
    };
};

Проблема в том, что я набираю все поля дважды , и это не только скучно, но и подвержено ошибкам .

Я не могу использовать return <Foo>{};, потому что есть случаи, когда объекты являются членами других объектов, поэтому у меня будут отсутствовать свойства, и выскочит undefined.

Я мог бы проверить, существует ли свойство при вызове, но поскольку свойство не имеет ?, это означает, что оно является обязательным, поэтому оно должно быть там.

Итак, есть ли лучший способ написать код выше?

1 Ответ

0 голосов
/ 27 июня 2019

Вы можете изменить способ ввода Foo и функции, и Foo будет любым типом возврата newFoo:

export type  Foo = ReturnType<typeof newFoo>

export function newFoo() {
    return {
        name: '',
        surname: '',
        cars: 0
    };
};

Если вы хотите, чтобы некоторые члены были необязательными или не инициализированы newFoo, вам придется проделать небольшую работу, чтобы добавить их, хотя это может быть излишним для сложных сценариев:

export type  Foo = ReturnType<typeof newFoo>

export function newFoo() {
    const optionalInitiazlised = {
        optionaButInited: ""
    }

    return  Object.assign(optionalInitiazlised as Partial<typeof optionalInitiazlised>,
        {} as { optionalProp?: string }, {
        name: '',
        surname: '',
        cars: 0
    });
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...