如何在TypeScript中使用可选链接?

时间:2019-04-05 10:36:50

标签: typescript visual-studio-code protractor

我想更改对象填充属性的方式。

目前我有

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 code IDE看不到任何问题,例如:当我将鼠标悬停在以下位置时:

  • 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不说它是错误?或者也许我需要做一些其他事情才能使它工作?

2 个答案:

答案 0 :(得分:0)

您应确保启用--strictNullChecks,即compiler option。大概您的项目中有一个tsconfig.json文件;您应该在此处指定。实际上,我建议使用--strict,其中包括--strictNullChecks以及其他有用的内容。希望这会开始警告您出现以下错误:

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

添加感叹号将无济于事;它是non-null assertion,表示您正在告诉编译器,即使认为该对象可能未定义,但肯定不是。基本上,这与您遇到的问题相反。如果您这样做:

   data.employment!.wage // no error now

它将{em>抑制 --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中获取的erased。如果希望进行运行时检查,则需要编写该运行时检查,并让TypeScript的类型检查器验证您是否已这样做:

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

TypeScript 确实尝试提供建议的JavaScript功能的实现,并且最终可能在JavaScript中支持optional chaining,但当前的建议仅在Stage 1处提供,并且TypeScript维护人员的一般政策是仅在语言达到第3阶段时实施附加语言。因此,TypeScript从TS3.4开始不支持可选的链接yet

好的,希望能有所帮助。祝你好运!

答案 1 :(得分:0)

最后的打字稿支持可选链接-https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html

因此您可以将打字稿版本更新为 3.7 或更高版本,并更新vscode的版本以使其正常工作。