类型断言
type T = 'a'|'b'|'c';
let foo = 'a';
let bar:T = foo as T; // 正确
上面示例中,最后一行的foo as T表示告诉编译器,变量foo的类型断言为T,所以这一行不再需要类型推断了,编译器直接把foo的类型当作T,就不会报错了。
any unknown void never
any 关闭类型校验 变量赋值污染问题
unknown是any的严格版。
unknown 类型表示一个值的类型是未知的,但与 any 不同,unknown 类型的值不能被读取,除非先进行类型检查。
let value: unknown;
value = 10; // 合法
value = "Hello"; // 合法
// 无法直接操作 unknown 类型的值
console.log(value.toUpperCase()); // 错误: Object is of type 'unknown'.
// 需要进行类型检查
if (typeof value === "string") {
console.log(value.toUpperCase()); // 合法
}
void 函数没有返回值,如果有返回值就报错。
never let x: never; 变量x的类型是never,就不可能赋给它任何值,否则都会报错。
Void:适用于那些不打算返回任何数据给调用者的函数。这类函数往往侧重于执行某些副作用(如修改状态、触发事件等),而不是计算结果。因此,当你只需要一个函数来执行任务而不关心其输出时,void 就是一个合适的选择。
Never:适合用于那些理论上不应该返回的函数,比如因为发生了致命错误而需要立即停止程序运行的场景。另外,在编写类型安全的代码时,never 可以作为一种工具来增强逻辑的一致性和严谨性,确保某些特定条件下代码路径确实不会被执行。
泛型
带有类型参数
function getFirst<T>(arr: T[]): T {
return arr[0];
}
函数名getFirst后面的尖括号就是类型参数
上例的函数getFirst()的参数类型是T[],返回值类型是T,就清楚地表示了两者之间的关系。比如,输入的参数类型是number[],那么 T 的值就是number,因此返回值类型也是number。
函数调用时,需要提供类型参数。
getFirst([1, 2, 3]);