类型推导 | Typescript 从入门到放弃系列(三)
2023-10-30 18:09:58
类型推导
在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