Typescript интерфейс и создание объекта этого интерфейса - PullRequest
0 голосов
/ 26 апреля 2018

Я создаю небольшое приложение на машинописном компьютере, где я использую интерфейсы для создавать объекты определенных типов, например, следующий UserProfile интерфейс.

Функции interface и fulfill определены в файле user-profile.ts.

export interface UserProfile  {

    readonly titel_id: number;
    readonly user_name: string;
    readonly email: string;
    readonly first_name: string;
    readonly last_name: string;
    readonly phone: string;
    readonly fax: string;

}

export function fulfill({  titel_id, user_name, email, first_name, last_name,  phone, fax }: any): UserProfile {
    return {

        titel_id,
        user_name,
        email,
        first_name,
        last_name,
        phone,
        fax
    }
}

Я вызываю эту функцию из моей UserMdoel's find функции, которая содержит все поля таблицы пользователя, а функция execute дает только те поля, которые указаны в интерфейсе. Но, как вы можете видеть, я должен написать поля 3 раза

один раз в интерфейсе, затем в деструктурировании объекта и затем в операторе возврата. Это означает, что если мне позже придется изменить поля, я должен изменить это в 3 местах.

Есть ли лучший способ решить эту проблему?

1 Ответ

0 голосов
/ 26 апреля 2018

Я обновил свой ответ.

Интерфейсы не выдерживают перехода к javascript.Одна вещь, которую вы могли бы сделать, это создать массив со всеми именами и использовать этот массив для автоматического копирования всех полей.

Однако вам все равно придется поддерживать поля в двух местах.

export const USER_PROFILE_FIELDS: string[] = [
    'titel_id',
    'user_name',
    'email',
    'first_name',
    'last_name',
    'phone',
    'fax',
];
export interface UserProfile  {

    readonly titel_id: number;
    readonly user_name: string;
    readonly email: string;
    readonly first_name: string;
    readonly last_name: string;
    readonly phone: string;
    readonly fax: string;

}

export function fulfill(template: any): UserProfile {
    return <UserProfile>USER_PROFILE_FIELDS.reduce(
        (object, key) => object[key] = template[key],
        {}
    );
}

Если вам это нужно для нескольких интерфейсов, вы можете создать функцию более высокого порядка, которая создаст для вас функцию выполнения.Таким образом, вам не нужно вручную создавать функцию выполнения для каждого случая.Вот пример:

// This function accepts the fields you want to use and returns your fulfill function
export function createFullfill<ResultingType>(fields: string[]) {
    return function(template: any) {
        return <ResultingType>fields.reduce(
            (object, key) => object[key] = template[key],
            {}    
        );
    } 
} 

// Fulfill function for UserProfile
export const fulfillUserProfile = createFullfill<UserProfile>(USER_PROFILE_FIELDS);
// Fulfill function for Project
export const fulfillProject = createFullfill<Project>(PROJECT_FIELDS);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...