L.Leverage Learn从第一行代码,到读懂真实后端查看项目源码

TypeScript 基础 / 第 6 课

描述对象与不同情况

用对象类型记录属性约定,用可选属性和联合类型表达可能出现的不同值。

◷ 预计 9 分钟 · 面向初学者

JavaScript 对象能把相关信息放在一起。TypeScript 可以写出对象类型,说明有哪些属性以及各自的值类型:

type Snack = {
  name: string;
  pieces: number;
};

const snack: Snack = { name: '饼干', pieces: 4 };

Snack 是一个类型别名,冒号后的大括号列出属性约定。name 必须是字符串,pieces 必须是数字;漏掉必需属性或写错属性值类型,检查时会报错。对象变量还可以在属性类型兼容的情况下重新赋值。类型描述程序预期的数据,不会在运行时自动检查对象。

有些信息不一定存在,可以在属性名后加 ?:

type Note = {
  text: string;
  color?: string;
};

现在 color 可以省略;读取 note.color 时,结果可能是字符串,也可能是 undefined。因此使用它前要考虑缺省情况,例如 note.color ?? '白色' 会在值为 null 或 undefined 时采用默认值。可选不等于可以随便填:如果出现,仍应是字符串。

有时一个值确实有两种可能,比如数量可能是数字,也可能是表示“暂缺”的文字。联合类型用竖线连接:

let stock: number | '暂缺';
stock = 5;
stock = '暂缺';

读取联合类型的值时,不能直接把它当作其中某一种。先判断,再执行只适用于该类型的操作:

function showStock(value: number | '暂缺'): string {
  if (typeof value === 'number') {
    return `剩余 ${value} 件`;
  }
  return value;
}

typeof 判断后,条件分支里的 value 被收窄为数字;另一条路径中它只能是文字 '暂缺'。收窄让代码在处理不同情况时保持明确。判断分支应覆盖你打算处理的情况,不能因为类型写在纸面上就假定数据永远符合预期。对可选属性做判断也很有用:if (note.color) 能先排除缺省值,再在分支中使用字符串;如果空字符串本身也是有效值,就应明确检查它是否为 undefined。

小练习:type Label = { text: string; emoji?: string } 中,哪些属性可以省略?若 emoji 存在,它是什么类型?另有 number | string 的值,怎样安全调用字符串的 toUpperCase()?

答案:emoji 可以省略;出现时是字符串。先用 typeof value === 'string' 判断,再在该分支调用 value.toUpperCase()。

互动练习:安全读取联合类型

值的类型是 string | number。排列安全使用它的步骤。

点击步骤将它移到队尾。

✓
这一课,你已经能……

对象类型列出属性,问号表示属性可缺省,联合类型要求先判断当前是哪一种值。