TypeScript - 隐式类型
TypeScript 是一种静态类型的编程语言,它是 JavaScript 的超集。它用于需要严格类型、面向对象编程概念和代码可重用性的大型 Web 应用程序。TypeScript 最重要的功能之一是能够自动推断类型。此功能称为隐式类型。
隐式类型是一种功能,它允许 TypeScript 在变量初始化时自动确定变量的类型。这使得编码更快、更容易且错误更少。本文将探讨 TypeScript 中隐式类型的概念,并通过示例讨论其优势。
什么是隐式类型?
隐式类型是 TypeScript 的一项功能,它根据变量的初始值或代码中的用法自动推断变量的类型,而不是要求程序员显式声明类型。
这意味着开发人员无需显式指定变量的类型,因为 TypeScript 会根据分配的值推断它。TypeScript 使用类型推断在没有显式类型注释的情况下提供类型信息,这发生在代码中的各个地方。例如,
let myVar = 10; // TypeScript infers the type of myVar as number let myString = "Hello, World!"; // string is type of myString
在上面的示例中,TypeScript 根据分配给它们的值自动将 myVar 的类型推断为 number,将 myString 的类型推断为 string。
在 TypeScript 中,类型推断发生在变量和成员初始化期间、为函数参数分配默认值时以及确定函数的返回类型时。此过程通常很简单且自动,允许语言根据代码中的上下文和用法推断类型。
隐式类型的示例
让我们看一些示例来了解隐式类型在 TypeScript 中是如何工作的。
示例 1:推断变量的类型
在上面的示例中,TypeScript 根据分配给它们的值将 myVar 的类型推断为 number,将 myString 的类型推断为 string,将 myBoolean 的类型推断为 boolean。
let myVar = 10; // TypeScript infers the type of myVar as number let myString = "Hello, World!"; // infers the type of myString as string let myBoolean = true; // infers the type of myBoolean as Boolean console.log(`The type of myVar is: ${typeof myVar}`); console.log(`The type of myString is: ${typeof myString}`); console.log(`The type of myBoolean is: ${typeof myBoolean}`);
输出
The type of myVar is: number The type of myString is: string The type of myBoolean is: boolean
示例 2:推断函数的类型
在上面的示例中,即使没有显式定义,TypeScript 也可以使用分配给它们的默认值来推断 add 函数参数的类型为 number。使用推断的参数类型,它还可以确定函数的返回类型。
function add(a = 2, b = 5) { console.log(`The typeof a is: ${typeof a}`); console.log(`The typeof b is: ${typeof b}`); return a + b; } add(4, 5);
输出
The typeof a is: number The typeof b is: number
示例 3:推断数组的类型
在下面的代码中,isNumberArray 是一个类型保护函数,它检查输入 arr 是否为数组,以及数组中的每个元素是否为 "number" 类型。is 关键字用于在函数签名中断言类型。
然后,我们将 myArray 声明为 any 类型以暂时绕过类型检查。然后,我们可以使用类型保护 isNumberArray 来检查 myArray 是否为有效的 number[] 数组。如果类型保护返回 true,则表示类型断言正确,我们可以安全地将 myArray 视为数字数组。
function isNumberArray(arr: any): arr is number[] { return Array.isArray(arr) && arr.every((value) => typeof value === "number"); } const myArray = [1, 2, 3]; if (isNumberArray(myArray)) { // Here, myArray is recognized as number[] console.log("myArray is an array of numbers"); } else { console.log("myArray is not an array of numbers"); }
编译后,它将生成以下 JavaScript 代码 -
function isNumberArray(arr) { return Array.isArray(arr) && arr.every(function (value) { return typeof value === "number"; }); } var myArray = [1, 2, 3]; if (isNumberArray(myArray)) { // Here, myArray is recognized as number[] console.log("myArray is an array of numbers"); } else { console.log("myArray is not an array of numbers"); }
输出
myArray is an array of numbers
如何确定隐式类型?
在初始化期间推断类型、使用提供的默认值获取函数参数的类型或确定函数的返回类型都非常简单。
当 TypeScript 从多个表达式推断类型时,它使用表达式类型来确定“最佳通用类型”。
let x = [4, "hello", null]
x 变量的推断类型是数组中每个值的最佳通用类型。因此,推断的类型变为 (number|string|null)[]。
由于“最佳通用类型”必须从提供的候选类型中选择,因此在某些情况下,类型共享一个共同的结构,但没有一个类型是所有候选类型的超类型。例如 -
let bouquet = [new Tulip(), new Dahlia(), new Orchid()];
在这种情况下,TypeScript 推断的类型是 (Tulip|Dahlia|Orchid)[],但理想情况下,我们可能希望 bouquet 被推断为 Flower[]。
但是,数组中没有严格为 Flower[] 类型的对象,我们不会对数组元素类型进行任何推断。因此,当没有一个类型是所有其他候选表达式的超类型时,我们需要显式提供类型 -
Let bouquet: Flower[] = [new Tulip(), new Dahlia(), new Orchid()];
当找不到最佳通用类型时,结果推断是联合数组类型,(Tulip|Dahlia|Orchid)[]。
隐式类型的优势
TypeScript 中隐式类型的优势在于 -
更快的编码 - 隐式类型通过消除显式指定每个变量类型的需要来节省时间和精力。
更少的错误 - 由于 TypeScript 自动推断变量的类型,因此在声明变量类型时出错的可能性较小。
代码可读性 - 隐式类型使代码更易于阅读,因为它减少了需要编写的代码量。
结论
隐式类型是 TypeScript 的一项强大功能,它允许语言根据分配给它们的值自动推断变量、函数、数组和对象的类型。此功能帮助开发人员编写更简洁、更简洁的代码,同时还减少了错误的可能性。此外,它节省了时间和精力,因为开发人员无需在代码中显式指定每个变量的类型。总的来说,隐式类型是一项宝贵的功能,有助于 TypeScript 在开发人员中越来越受欢迎。