TypeScript的新类型(七):type,使用type定义声明函数类型时限制返回值为void的特殊情况

9 阅读2分钟

定义

type可以为任意类型创建别名,让代码更简洁、可读性更强,同时能更⽅便地进⾏类型复⽤和扩展。

基本用法

类型别名使⽤type关键字定义,type后跟类型名称,例如下⾯代码中num是类型别名。

  • 使用type关键字定义类型的别称,默认情况下首字母大写或者全大写
  • 可以定义函数、数组、对象
type Num = number
let price: Num
price = 1220 // 不会报错因为上面用type定义了一个新的类型别名,实际类型还是number
price = 'jason' // 报错:不能将类型“string”分配给类型“number”

联合类型

联合类型是⼀种⾼级类型,它表示⼀个值可以是⼏种不同类型之⼀

  • 使用|符号拼接,类似与逻辑运算符里面的逻辑类似
type Status = number | string
type Gender = '男' | '⼥'
function printStatus(status: Status) {
 console.log(status);
}
function logGender(str:Gender){
 console.log(str)
}

// printStatus函数的实参只能是数字或字符串类型
printStatus(404);
printStatus('200');
printStatus('501');
// logGender函数的参数只能是男或女的字符串
logGender('男')
logGender('⼥')

交叉类型

交叉类型(Intersection Types)允许将多个类型合并为⼀个类型。合并后的类型将拥有所有被合并类型的属性。交叉类型通常⽤于对象类型。

  • 适用&符号拼接,类似于逻辑运算符里面的逻辑类似
//⾯积
type Area = {
 height: number; //⾼
 width: number; //宽
};
//地址
type Address = {
 num: number; //楼号
 cell: number; //单元号
 room: string; //房间号
};
// 定义类型House,且House是Area和Address组成的交叉类型
type House = Area & Address;
const house: House = {
 height: 180,
 width: 75,
 num: 6,
 cell: 3,
 room: '702'
};

使用type定义声明函数类型时限制返回值为void的特殊情况

  • 使用type关键字定义声明函数类型时限制函数返回值void时,TypeScript并不会严格要求函数返回空,而是 可以返回任意类型的值
  • 无法使用 该函数的返回值 进行任何操作
// 可以返回任意类型的值
type LogFunc = () => void
const f1: LogFunc = () => {
 return 100; // 允许返回⾮空值
};
const f2: LogFunc = () => 200; // 允许返回⾮空值
const f3: LogFunc = function () {
 return 300; // 允许返回⾮空值
};

// 无法使用返回值进行任何操作
if(f1()) console.log(1); // 报错: 无法测试 "void" 类型的表达式的真实性。

为什么会这样?

TS官⽅⽂档的说明:Assignability of Functions

  • 是为了确保如下代码成⽴,Array.push的返回值是⼀个number数字类型(当前数组最新的长度),⽽Array.forEach⽅法期望其回调的返回类型是void
  • 简单理解是为了满足箭头函数 方法体只有一行代码简写的情况。箭头函数方法体只有一行的情况下可以不用写{}方法块,并且函数默认返回该行代码执行后的值。
const src = [1, 2, 3];
const dst = [0];
src.forEach((el) => dst.push(el));