TypeScript类型注解123

TypeScript是JavaScript的一个超集,它为这门语言添加了静态类型检查能力。类型注解是TypeScript的核心特性之一,允许开发者指定变量、函数参数和返回值的类型。这样做可以提高代码的清晰度和可维护性,并在编译期间捕捉潜在的错误。下面我将深入解释TypeScript中的类型注解和高级类型功能。

基础类型注解

在TypeScript中,可以为变量、函数参数和返回值指定类型,以确保它们按预期方式工作。

变量类型注解

变量类型注解简单明了,它们指明了变量可以存储的数据类型。

ini 复制代码
let isActive: boolean = true; // 只能赋值为true或false
let total: number = 0; // 任何数字,包括整数和浮点数
let name: string = "John Doe"; // 任何字符串

数组类型注解

数组类型注解指定了数组中元素的类型,确保数组中的所有元素都是同一类型。

typescript 复制代码
let numbers: number[] = [1, 2, 3, 4, 5]; // 数组中的每个元素都必须是数字
let words: Array<string> = ["hello", "world"]; // 使用泛型语法定义字符串数组
let items: Array<string | number> = ["hello", "world", 1, 2]; // 这里,Array<string | number> 是使用泛型 Array<T> 语法,并将 string | number 作为泛型参数传递,表示数组中的元素可以是字符串或数字。

函数类型注解

函数类型注解指定了参数类型和函数返回值的类型。

c 复制代码
// 指定函数参数和返回值的类型
function greet(name: string): string {
    return "Hello, " + name;
}

对象类型注解

对象类型注解可以通过接口(interface)或类型别名(type)来定义。

typescript 复制代码
// 使用接口定义对象类型
interface User {
    name: string;
    age: number;
}
​
let user: User = {
    name: "Jane Doe",
    age: 30
};

高级类型功能

TypeScript提供了多种高级类型功能,允许开发者创建更复杂和可重用的类型定义。

泛型(Generics)

泛型是类型参数化的工具,它允许你定义一个函数、接口或类的类型,使其可以在多种类型之间工作而不失类型信息。

csharp 复制代码
// 定义一个泛型函数
function identity<T>(arg: T): T {
    return arg;
}
​
// 使用时可以指定T为任意类型
let output = identity<string>("myString");

泛型提高了函数或类的灵活性,同时保持了类型安全。

交叉类型(Intersection Types)

交叉类型是将多个类型合并为一个类型,这通常用于组合多个类型的特性。

ini 复制代码
// 将两个类型合并成一个
type ReadableStreamable = Readable & Streamable;

在上面的示例中,ReadableStreamable 将具有 ReadableStreamable 两个类型的所有属性。

联合类型(Union Types)

联合类型表示一个值可以是几个不同类型中的任意一个。

php 复制代码
// 参数可以是字符串或数字
function padLeft(value: string, padding: string | number) {
    // ...
}

在这个例子中,padding 可以是字符串或数字。

类型别名(Type Aliases)

类型别名用于给复杂的类型表达式创建一个新名字。

typescript 复制代码
// 创建一个联合类型别名
type StringOrError = string | Error;

StringOrError 可以是字符串或错误对象。

映射类型(Mapped Types)

映射类型可以通过旧类型的每个属性来创建新类型。

ini 复制代码
// 创建一个只读版本的类型
type ReadOnly<T> = { readonly [P in keyof T]: T[P] };

在这里,ReadOnly<T> 创建了一个 T 的只读版本。

条件类型(Conditional Types)

条件类型根据类型关系在两种类型之间选择。

typescript 复制代码
// 根据条件选择类型
type Check<T> = T extends string ? boolean : number;

如果 T 可以赋值给 string,那么 Check<T> 就是 boolean 类型;否则是 number 类型。

类型断言

类型断言允许开发者指定一个值的具体类型。

typescript 复制代码
// 使用类型断言
let someValue: any = "this is a string";
let strLength: number = (someValue as string).length;

枚举(Enums)

枚举是一种特殊的类型,它定义了一组命名的常数。

scss 复制代码
// 定义一个数字枚举
enum Direction {
    Up = 1,
    Down,
    Left,
    Right,
}

元组(Tuples)

元组允许你表达一个已知元素数量和类型的数组。

ini 复制代码
// 定义一个元组类型
let x: [string, number];
x = ["hello", 10]; // 正确

Never类型

never 类型表示那些永不存在的值的类型。

typescript 复制代码
// never类型的函数
function error(message: string): never {
    throw new Error(message);
}

类型守卫

类型守卫用于缩小类型的范围。

javascript 复制代码
// 类型守卫的示例
function isFish(pet: Fish | Bird): pet is Fish {
    return (pet as Fish).swim !== undefined;
}

类型推断

当没有明确指出类型时,TypeScript会根据上下文自动推断出一个类型。

csharp 复制代码
// 类型推断的示例
let x = 3; // 类型被推断为number

类型兼容性

TypeScript中的类型兼容性是基于结构子类型的。

csharp 复制代码
interface Named {
    name: string;
}
​
class Person {
    name: string;
}
​
let p: Named;
p = new Person(); // 结构类型兼容性

声明合并

TypeScript允许同一个名字的接口或命名空间的多个声明合并为一个声明。

css 复制代码
// 接口声明合并
interface Box {
    height: number;
}
​
interface Box {
    width: number;
}
​
let box: Box = { height: 5, width: 6 }; // 合并后的接口

typeinterface 的区别

扩展性

interface 是开放式的,可以通过声明合并来扩展,而 type 是封闭的,不支持声明合并。

typescript 复制代码
// `interface` 可以扩展
interface Animal {
    name: string;
}
​
interface Bear extends Animal {
    honey: boolean;
}
​
// `type` 不能合并,但可以通过交叉类型来扩展
type Animal = {
    name: string;
};
​
type Bear = Animal & { 
    honey: boolean 
};

推荐使用场景

  • 当定义对象的形状,尤其是希望在多个地方被扩展或实现时,使用 interface
  • 当定义联合类型、交叉类型,或者需要利用类型操作时,使用 type

通过上述解释,我们可以看到TypeScript提供了强大的类型系统,它不仅包括JavaScript的基本类型,还增加了枚举、元组、泛型等高级类型,以及类型守卫、类型兼容性等高级特性。这些工具可以帮助开发者编写更加健壮和易于维护的代码。

相关推荐
水银嘻嘻几秒前
12 web 自动化之基于关键字+数据驱动-反射自动化框架搭建
运维·前端·自动化
it_remember2 分钟前
新建一个reactnative 0.72.0的项目
javascript·react native·react.js
小嘟嚷ovo23 分钟前
h5,原生html,echarts关系网实现
前端·html·echarts
十一吖i1 小时前
Vue3项目使用ElDrawer后select方法不生效
前端
只可远观1 小时前
Flutter目录结构介绍、入口、Widget、Center组件、Text组件、MaterialApp组件、Scaffold组件
前端·flutter
周胡杰1 小时前
组件导航 (HMRouter)+flutter项目搭建-混合开发+分栏效果
前端·flutter·华为·harmonyos·鸿蒙·鸿蒙系统
敲代码的小吉米1 小时前
前端上传el-upload、原生input本地文件pdf格式(纯前端预览本地文件不走后端接口)
前端·javascript·pdf·状态模式
是千千千熠啊1 小时前
vue使用Fabric和pdfjs完成合同签章及批注
前端·vue.js
da-peng-song1 小时前
ArcGIS Desktop使用入门(二)常用工具条——数据框工具(旋转视图)
开发语言·javascript·arcgis
九月TTS2 小时前
TTS-Web-Vue系列:组件逻辑分离与模块化重构
前端·vue.js·重构