Skip to content

可选属性

在使用一个对象实现了带有可选属性的接口时,可以自由选择是否在该对象中包含可选属性。编译器不会强制要求必须包含可选属性,但会在类型检查时提供相应的警告。
接口里的属性不全都是必需的。 有些是只在某些条件下存在,或者根本不存在。 可选属性在应用“option bags”模式时很常用,即给函数传入的参数对象中只有部分属性赋值了。 下面是应用了“option bags”的例子:

ts
interface SquareConfig {
  color?: string;
  width?: number;
}

function createSquare(config: SquareConfig): {color: string; area: number} {
  let newSquare = {color: "white", area: 100};
  if (config.color) {
    newSquare.color = config.color;
  }
  if (config.width) {
    newSquare.area = config.width * config.width;
  }
  return newSquare;
}

let mySquare = createSquare({color: "black"});

带有可选属性的接口与普通的接口定义差不多,只是在可选属性名字定义的后面加一个?符号。
可选属性的好处之一是可以对可能存在的属性进行预定义,好处之二是可以捕获引用了不存在的属性时的错误。 比如,我们故意将createSquare里的color属性名拼错,就会得到一个错误提示:

ts
interface SquareConfig {
  color?: string;
  width?: number;
}

function createSquare(config: SquareConfig): { color: string; area: number } {
  let newSquare = {color: "white", area: 100};
  if (config.color) {
    // Error: Property 'clor' does not exist on type 'SquareConfig'
    newSquare.color = config.clor;
  }
  if (config.width) {
    newSquare.area = config.width * config.width;
  }
  return newSquare;
}

let mySquare = createSquare({color: "black"});

注意点

在对可选属性进行访问时,需要注意进行空值检查,以防止出现空引用错误。可以使用可选链式操作符(?.)来进行安全访问,后面我们也会提到接口额外的属性检查。

ts
if (person2.email) {
  console.log(`Email: ${person2.email}`);
} else {
  console.log('No email provided');
}

上述代码中,我们通过判断person2.email是否存在来进行安全访问,并在不存在时输出相应的提示。
使用可选属性可以灵活地定义接口,使其适应不同的对象结构,同时提供了对对象属性的选择性约束。这在处理可能存在不确定的属性或可选配置时特别有用。

仅用于培训和测试,通过使用本站代码内容随之而来的风险与本站无关。版权所有,未经授权请勿转载,保留一切权利。
ICP备案号:滇ICP备15009214号-13   公安网备:滇公网安备 53312302000061号