返回

类型推导 | Typescript 从入门到放弃系列(三)

前端

类型推导

在Typescript中,类型推导是一种非常重要的概念。它允许编译器根据变量的赋值来推断出变量的类型。这意味着,在声明变量时,我们不需要显式地指定变量的类型,编译器会根据变量的赋值来推断出变量的类型。

声明变量时没有赋予值

当声明变量时,如果我们没有赋予它任何值,那么编译器会将该变量的类型默认设置为any。any类型是一种特殊的类型,它可以表示任何类型的值。这意味着,我们可以将任何类型的值赋给any类型的变量,而编译器不会报错。

let x: any; // 声明了一个any类型的变量x
x = 1; // 将一个数字值赋给x
x = "Hello"; // 将一个字符串值赋给x
x = true; // 将一个布尔值赋给x

声明变量时赋予值

当声明变量时,如果我们赋予它一个值,那么编译器会根据变量的值来推断出变量的类型。例如,如果我们声明了一个变量x,并赋予它一个数字值,那么编译器会将x的类型推断为number。

let x = 1; // 声明了一个变量x并赋予它一个数字值1
console.log(typeof x); // 输出"number",表明x的类型为number

包装对象

在Typescript中,基本数据类型和引用数据类型是两种不同的类型。基本数据类型包括number、string、boolean、symbol和undefined。引用数据类型包括对象、数组、函数等。

当我们使用基本数据类型时,调用基本数据类型上的方法,默认会将原始数据类型包装成对象类型。例如,当我们调用number类型的变量x上的toString()方法时,编译器会将x包装成一个Number对象,然后调用Number对象上的toString()方法。

let x = 1; // 声明了一个number类型的变量x
console.log(x.toString()); // 输出"1",表明x被包装成了一个Number对象

当我们使用引用数据类型时,调用引用数据类型上的方法,不会将引用数据类型包装成对象类型。例如,当我们调用对象类型的变量y上的toString()方法时,编译器不会将y包装成一个对象类型,而是直接调用对象类型上的toString()方法。

let y = { name: "John Doe" }; // 声明了一个对象类型的变量y
console.log(y.toString()); // 输出"[object Object]",表明y没有被包装成一个对象类型

联合类型

联合类型是一种允许一个变量同时具有多个类型的类型。例如,我们可以定义一个变量x,它的类型是number或string。这意味着,我们可以将数字值或字符串值赋给x。

let x: number | string; // 声明了一个联合类型的变量x
x = 1; // 将一个数字值赋给x
x = "Hello"; // 将一个字符串值赋给x

函数重载

函数重载是指一个函数可以具有多个不同的签名。这意味着,我们可以定义一个函数,它可以接受不同的参数类型并返回不同的结果。例如,我们可以定义一个函数sum,它可以接受两个数字参数并返回它们的和,或者接受一个数组参数并返回数组中所有数字的和。

function sum(x: number, y: number): number; // 声明了一个函数sum,它接受两个数字参数并返回它们的和
function sum(x: number[]): number; // 声明了一个函数sum,它接受一个数组参数并返回数组中所有数字的和

function sum(x: any, y?: any): number { // 实现函数sum
  if (typeof x === "number" && typeof y === "number") {
    return x + y;
  } else if (Array.isArray(x)) {
    return x.reduce((a, b) => a + b, 0);
  } else {
    throw new Error("Invalid arguments");
  }
}

console.log(sum(1, 2)); // 输出3
console.log(sum([1, 2, 3])); // 输出6