【问题标题】:Optional property class in typescript打字稿中的可选属性类
【发布时间】:2018-06-05 03:28:47
【问题描述】:

我是打字稿的新手,我想知道打字稿中可选属性类的用途是什么?和有什么区别:

a?: number;

a: number | undefined;

【问题讨论】:

标签: typescript properties


【解决方案1】:

参数

可选参数和参数类型number | undefined之间的区别在于您不必提供参数...

function a(a?: number) {
    return a;
}

function b(a: number | undefined) {
    return a;
}

// Okay
a();
b(1);

// Not okay: Expected 1 arguments, but got 0.
b();

这适用于函数、方法和构造函数。

严格的空检查

如果您打开严格的空检查,您会发现任何可选参数或属性都会自动获得联合类型。这意味着下面示例中的id 具有number | undefined 类型,即使您只指定了number

// With strict null checks, this:
class Example {
    id?: number;
}

// ... is the same as this:
class Example {
    id?: number | undefined;
}

// ... and this:
class Example {
    id: number | undefined;
}

我建议使用第一个示例,因为它可以使属性和参数之间的语法保持一致。

【讨论】:

    【解决方案2】:

    可选属性: 在 Typescript 中,您可以在界面中声明一个属性,该属性是可选的。假设您有一个员工接口并且中间名是可选的,那么您的代码将如下所示:

    interface IEmployee {
      firstName: string;
      lastName: string;
      middleName?: string;
    }
    

    当有人使用您的接口 IEmployee 时,middleName 将是可选的,但 firstName 和 lastName 是强制性的。

    let emp: IEmployee = { firstName: "Hohn", lastName: "Doe" }
    

    管道操作员: 有时您希望一个变量可以包含多种类型。如果您将属性声明为数字,则它只能包含数字。管道运算符可以告诉打字稿它可以容纳多种类型。当您从函数返回某些内容并且可以根据条件返回多种类型时,管道运算符非常有用的其他情况。

    希望对你有帮助

    【讨论】:

    • 所以类型的兼容性很重要。同样的例子也适用于课堂,对吧?
    • 管道运算符也可以在类中工作,但可选属性仅适用于接口。类中可选属性没有意义。
    • 我想做同样的事情,但是根据同一接口中其他属性的值强制一些可选属性。示例:如果 firstName 是“foo1”,我想强制使用 middleName
    • 引用emp.middleName 是否安全?例如,hasMiddle = !!emp.middleName。或者这会导致“emp 没有属性 middleName”之类的问题吗?
    猜你喜欢
    • 2021-12-30
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    • 2016-11-01
    • 2021-11-30
    • 2019-12-22
    • 2018-10-17
    • 1970-01-01
    相关资源
    最近更新 更多