Как использовать Необязательное Chaining в TypeScript? - PullRequest
2 голосов
/ 05 апреля 2019

Я хочу изменить способ заполнения объекта свойствами.

В настоящее время у меня есть

export interface INewOffer {
    employment?: IEmployment;
    heightWeight?: IHeightWeight;
}

export interface IEmployment{
    trainings?: string;
    activeEmployment?: string;
    wage?: string;
}

И функция, которая создает объект, выглядит так:

private dataGenerator(newCustomer: INewCustomer): INewOffer {
    const data: INewOffer = {};
    if (NullCheck.isDefinedOrNonNull(newCustomer.age)) {
        data.employment = {
            trainings: newCustomer.trainings,
            activeEmployment: newCustomer.activeEmployment,
            wage: newCustomer.wage,
        };
    } else {
        data.employment = {
            wage: newCustomer.wage,
            };
        }
    data.heightWeight = {
        height: '180',
        weight: '75',
    };
    return data;
}

Я пытался изменить свой код на

private dataGenerator(newCustomer: INewCustomer): INewOffer {
    const data: INewOffer = {};
    if (NullCheck.isDefinedOrNonNull(newCustomer.age)) {
            data.employment.trainings = newCustomer.trainings;
            data.employment.activeEmployment = newCustomer.activeEmployment;
            data.employment.wage = newCustomer.wage
    } else {
           data.employment.wage = newCustomer.wage
    }
    data.heightWeight.height = '180';
    data.heightWeight.weight = '75';

    return data;
}

и VS IDE ID не видит никаких проблем, например: когда я наводю курсор мыши на:

  • data. он говорит const data: INewOffer

  • employment. => (property) INewOffer.employment?: IEmployment

  • wage => (property) IEmployment.wage?: string

но когда я запускаю тест, у меня появляется ошибка:

E/launcher - Error: TypeError: Cannot set property 'wage' of undefined

Я попытался установить его так: data.employment!.wage = newCustomer.wage

но это не работает. Затем я обнаружил, что в машинописи нет опциональной цепочки необязательных данных.

и мой вопрос: почему IDE не говорит об ошибке? или, может быть, я должен сделать что-то еще, чтобы это работало?

1 Ответ

0 голосов
/ 05 апреля 2019

Не забудьте включить --strictNullChecks, параметр компилятора . Предположительно, у вас есть файл tsconfig.json в вашем проекте; Вы должны указать это там. На самом деле, я рекомендую использовать --strict, который включает --strictNullChecks плюс другие полезные вещи. Надеемся, что это должно начать предупреждать вас с такими ошибками:

   data.employment.wage // error!
// ~~~~~~~~~~~~~~~ <-- Object is possibly undefined.

Добавление восклицательного знака не поможет; это ненулевое утверждение , что означает, что вы сообщаете компилятору, что, хотя it считает, что объект может быть неопределенным, you уверены, что это не так. Это в основном противоположность вашей проблемы. Если вы сделаете это:

   data.employment!.wage // no error now

будет подавлять ошибку, которая включается --strictNullChecks, но взрывается во время выполнения, так как вы солгали компилятору. Это утверждение предназначено для таких ситуаций:

// this ends up setting data.employment to {} but the compiler doesn't realize it
   Object.assign(data, { employment: {} }); 

   data.employment.wage // error!  but we know it *is* defined
// ~~~~~~~~~~~~~~~ <-- Object is possibly undefined.

   data.employment.wage // no error now

Система типов TypeScript существует только во время разработки (когда вы пишете программу) и полностью стерта из запущенного JavaScript, который работает. Если вы хотите, чтобы проверка во время выполнения происходила, вам нужно написать эту проверку во время выполнения и позволить средству проверки типа TypeScript убедиться, что вы сделали это:

  data.employment = {}; // set the property in a way the compiler recognizes
  data.employment.wage; // no error now

TypeScript пытается предоставить реализации для предложенных функций JavaScript, и в конечном итоге может быть поддержка необязательной цепочки в JavaScript, но текущее предложение только на Этап 1 , и общая политика сопровождающих TypeScript состоит в том, чтобы реализовывать языковые дополнения только после того, как они достигают стадии 3. Таким образом, TypeScript пока не поддерживает необязательную цепочку пока с TS3.4.

Хорошо, надеюсь, это поможет. Удачи!

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