any 类型:
-
any
类型是TypeScript
中的顶级类型,它可以接受任何类型的值,相当于取消了类型检查。 -
当将变量声明为
any
类型时,可以赋予它任何值,无论是数字、字符串、布尔值还是其他类型的值。 -
使用
any
类型可能会降低类型安全性,因为编译器不会对其进行类型检查,所以应该谨慎使用。let x: any; x = 5; // 可以赋值为数字 x = "hello"; // 可以赋值为字符串 x = true; // 可以赋值为布尔值 console.log(x.length); // 由于 x 是 any 类型,编译器不会检查 length 属性的存在性,因此不会报错
unknown 类型:
-
unknown
类型表示未知类型的值,它与any
类型不同,使用unknown
类型时需要进行类型检查或类型断言来确定其具体类型。 -
unknown
类型提供了更严格的类型安全性,因为它要求在使用前进行类型检查。let x: unknown; x = 5; if (typeof x === "number") { console.log(x * 2); // 可以进行数值操作 } x = "hello"; if (typeof x === "string") { console.log(x.toUpperCase()); // 可以调用字符串方法 } console.log(x.length); // 由于 x 是 unknown 类型,编译器会报错,因为 length 属性不一定存在
never 类型:
-
never
类型表示永远不会发生的类型,通常用于描述无法返回值的函数或不可达代码。 -
当函数抛出异常、具有无限循环或具有类型保护时,可以将其返回类型标注为
never
。//函数抛出异常的示例: function throwError(message: string): never { throw new Error(message); } throwError("Something went wrong"); // 抛出异常,函数不会返回
-
函数具有无限循环的示例:
function infiniteLoop(): never { while (true) { console.log("Hello"); } } infiniteLoop(); // 无限循环,函数不会返回
-
函数具有类型保护的示例:
function checkNever(x: string | number): never { throw new Error("Unexpected value: " + x); } function processValue(x: string | number) { if (typeof x === "string") { // 在这个条件分支中,x 被推断为 string 类型 console.log(x.toUpperCase()); } else { // 在这个条件分支中,x 被推断为 number 类型 checkNever(x); // 抛出异常,函数不会返回 } }
void 类型:
void
类型表示没有任何类型,通常用于表示函数没有返回值。- 函数声明为
void
类型意味着它不会返回任何值。 - 变量可以被赋值为
undefined 或 null
,但不能赋值为其他类型的值。function logMessage(): void { console.log("Hello, TypeScript"); } const result: void = logMessage(); // 函数没有返回值,result 为 undefined let myVoidVariable: void; myVoidVariable = undefined; // 可以赋值为 undefined myVoidVariable = null; // 可以赋值为 null