TypeScript 隐式类型

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 函数的参数类型,即使它们没有明确定义。使用参数的推断类型,它还可以确定函数的返回类型。

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受开发人员欢迎的一个有价值的特性。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程