类型保护

JS typeof操作符 在运行时 返回一个值的基本类型,可以使用typeof 收缩类型的判断

  1. function printAll(strs:string|string[]|null){
  2. if(typeof strs === 'object'){
  3. for(const s of strs){
  4. console.log(s)
  5. }
  6. }else if(typeof strs === 'string'){
  7. console.log(strs)
  8. }else{
  9. //dothing
  10. }
  11. }

通过typeof 确定 不同类型下的处理结果, 但此时还会有一个警告, strs 可能是null, 这就需要用到 真值收窄

真值收窄

通过JS的隐式转换 来确定一个表达式的true 和false,我们也可以用来去判断一个值是否存在

  1. function printAll(strs:string|string[]|null){
  2. if(strs && typeof strs === 'object'){
  3. for(const s of strs){
  4. console.log(s)
  5. }
  6. }else if(typeof strs === 'string'){
  7. console.log(strs)
  8. }else{
  9. //dothing
  10. }
  11. }
  1. function printAll(strs:string|string[]|null){
  2. if(typeof strs === 'object'){
  3. for(const s of strs!){
  4. console.log(s)
  5. }
  6. }else if(typeof strs === 'string'){
  7. console.log(strs)
  8. }else{
  9. //dothing
  10. }
  11. }
in收窄
  1. type Fish = { swim: () => void };
  2. type Bird = { fly: () => void };
  3. function move(animal: Fish | Bird) {
  4. if ("swim" in animal) {
  5. return animal.swim();
  6. // (parameter) animal: Fish
  7. }
  8. return animal.fly();
  9. // (parameter) animal: Bird
  10. }
类型判断式
  1. function isFish(pet: Fish | Bird): pet is Fish {
  2. return (pet as Fish).swim !== undefined;
  3. }
  4. let pet = getSmallPet();
  5. //此时Ts还会自动推导else中的pet 是Bird
  6. if (isFish(pet)) {
  7. pet.swim(); // let pet: Fish
  8. } else {
  9. pet.fly(); // let pet: Bird
  10. }