TypeScript 基础 / 第 6 课
描述对象与不同情况
用对象类型记录属性约定,用可选属性和联合类型表达可能出现的不同值。
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。排列安全使用它的步骤。
点击步骤将它移到队尾。
对象类型列出属性,问号表示属性可缺省,联合类型要求先判断当前是哪一种值。