这是我参与2022首次更文挑战的第37天,活动详情查看:2022首次更文挑战
断言函数
断言函数用于检查实际参数的类型是否符合类型判定。若符合类型判定,这个函数会正常返回。如果不符合类型判定,这个函数会抛出异常。下面语法中冒号后面的表示类型判定,只能作为函数的返回值类型。asserts和is是关键字。如果一个函数中带有asserts类型判定,那么这个函数就是一个断言函数。下面第一个语句asserts is T中只有在实际参数类型为T的时候才会返回,否则会报错。而asserts x中只有在实际参数的值为真的时候才会正常返回,否则也会抛出异常。asserts类型会被视为void类型,所以断言函数的返回值类型也是void。在断言函数中如果断言判定失败,程序抛出异常并停止继续向后执行代码。如果断言判定成功,程序继续向后执行代码。
function people(x: unknown): asserts x is T{ };
function people(x: unknown): asserts x {}
子类型
子类型表示方法X <: Y这样表示X是类型Y的子类型,反过来X :> Y意思是类型X是类型Y的超类型。X <: X 且 X :> X表示任意类型都是其自身的子类型和超类型。如果类型X是类型Y的子类型而且Y类型时Z的子类型。那么X也是Z的子类型。所有类型都是any类型和unknown类型的子类型。而never类型时所有类型的子类型。
number <: any;
{} <: any;
never <:{};
never <: () => void;
原始类型
原始类型中字面量类型是对应的基础原始类型的子类型。undefined类型时除尾端类型never外所有类型的子类型。null类型时除尾端类型和undefined类型外的所有类型的子类型。联合枚举成员类型时联合枚举类型的子类型。数值型枚举类型时number类型的子类型。
Symbol() <: symbol;
5n <: bigint;
undefined <: null;
undefined <: {};
null <: null;
null <: () => void
变形
两个复杂类型Complex(A)和Complex(B),当A是B的子类型能够得到这两个复杂类型就称为协变。如果A是B的子类型得到相反的复杂类型称为逆变。如果A是B子类型或B是A子类型得到两个复杂类型则称为双变。如果没有关系,则称为不变。当函数类型Z是函数X的子类型,那么Z的剩余参数也不计入参数总数。当将..b修改为b?,就表示S中的可选参数不计入参数总数。
type Z = (a: boolean, ..b: boolean[]) => void;
type X = (x: boolean) => void;