【利用AI让知识体系化】TypeScript目标:扩展JavaScript能力

news2025/2/25 15:09:10

在这里插入图片描述

I. TypeScript 简介

TypeScript 的起源

TypeScript 的起源是由微软公司开发,其首席架构师是 Anders Hejlsberg。Anders 是 Delphi 和 C# 语言的创始人,于2012年从微软发布了 TypeScript。

TypeScript 诞生的原因是为了解决 JavaScript 的一些缺点,比如 JavaScript 缺乏强类型,没有模块化等。TypeScript 的目标是扩展 JavaScript 的能力并提高开发者的生产效率。

相较于 JavaScript,TypeScript 更接近于强类型静态编程语言。它在 JavaScript 的基础上,增加了一些静态类型检测的功能。这些功能可以帮助开发者在编写代码的时候更快速地找到潜在的错误,并且缩小了调试时的范围。

TypeScript 还提供了面向对象编程的特性,如类、泛型、接口等。这些特性可以大大提高代码的可维护性,让代码更简洁、易读、可扩展和可重构。

总而言之,TypeScript 是一个让 JavaScript 更加加强的超集语言,它提供了更多的优点和特性,使得大型项目和团队开发变得更加容易。

TypeScript 和 JavaScript 的关系

TypeScript 和 JavaScript 的关系是 TypeScript 扩展了 JavaScript
即 TypeScript 是 JavaScript 的超集。

TypeScript 可以编写更高效的 JavaScript 代码,提高开发的效率和代码的可维护性。

TypeScript 提供了静态类型系统, 这使得很多编码问题在编写代码时就可以被发现并解决。而 JavaScript 是动态类型语言,因此没有这些优势,很多错误只有运行时才能被发现。

TypeScript 还提供了面向对象编程的语法。它可以使用类、接口等描述代码组织结构和功能,这些都是 JavaScript 所缺乏的。

TypeScript 的代码可以直接编译成 JavaScript,所以使用 TypeScript 编写代码时可以更加自由与灵活地选择是否使用 TypeScript 的特性。

因为 TypeScript 是 JavaScript 的超集,因此 TypeScript 的所有特性都可以在 JavaScript 中使用。可以使用类、接口等特性编写面向对象的 JavaScript 代码,同时使用 JavaScript 特有的语法和特性。

总而言之,TypeScript 和 JavaScript 是强关联、兼容与相互促进的。它们的关系如同 XML 与 HTML 之于 SGML(标准通用标记语言)那样,TypeScript 是 JavaScript 的更高级的扩展,JavaScript 是通用编程语言,而 TypeScript 扩展了它。

TypeScript 的主要特点

TypeScript 的主要特点有:

  1. 强类型静态编程语言:TypeScript 提供了静态类型系统,它可以提前发现和预防类型错误,增强了代码健壮性和可读性。

  2. 支持 ES6+ 的语法特性:TypeScript 支持各种 ES6+ 新特性,如箭头函数、类、模板字面量、解构、默认参数和可选参数等。

  3. 支持面向对象编程(OOP):TypeScript 支持类和接口等面向对象编程特性,可以更好地组织代码,提高代码的可维护性和可读性。

  4. 可扩展:使用 TypeScript 可以进行扩展。使用它可以定义新的数据类型,增加新的库或模块,定制项目等。

  5. 跨平台兼容性:TypeScript 可以编译成 JavaScript,因此它可以在任何支持 JavaScript 的环境中运行,包括 Web 平台和 Node.js 等平台。

  6. 代码规范:TypeScript 强制使用一些代码规范,如使用 const 和 let 而不是 var 等。这些规范可以确保编写的代码更加规范、清晰,同时也减少了代码的 bug 出现。

  7. 类型注解:TypeScript 提供了类型注解,开发者可以在开发过程中注明每个变量和函数参数的数据类型。这使得代码更易懂、可维护性较高。

总而言之,TypeScript 主要特点包括静态类型、支持 ES6+ 新特性、支持面向对象编程、可扩展、跨平台兼容性、规范化、类型注解等。这些优点使得 TypeScript 得到了广泛的应用和支持,并成为了一个备受关注的编程语言。

II. TypeScript 的开发环境

安装 TypeScript

安装 TypeScript,步骤如下:

  1. 首先,需要安装 Node.js。可以从 Node.js 的官网下载并安装相应版本的 Node.js。

  2. 安装 TypeScript。可以使用 npm 命令进行安装。在命令行工具中输入以下命令:

npm install -g typescript

这个命令将会全局安装最新版本的 TypeScript。

  1. 验证 TypeScript 是否成功安装。在命令行中输入以下命令:
tsc -v

如果命令行返回了 TypeScript 的版本号,则表示 TypeScript 安装成功。

现在你已经成功安装了 TypeScript!

与 IDE 集成

TypeScript 是一种开放源代码编程语言,它可以与多个流行的集成开发环境 (IDE) 配合使用,以提高开发效率。

以下是几种常用的 IDE 的 TypeScript 集成方法:

  1. Visual Studio Code:Visual Studio Code 是一个免费的跨平台代码编辑器,并且提供了强大的 TypeScript 支持。需要在本地计算机上安装 TypeScript,然后在 Visual Studio Code 中使用 Auto-Install 标志来安装 TypeScript 插件。

  2. WebStorm:WebStorm 是一款专业的 IDE,适用于 Web 开发。它提供了先进的代码补全和代码检查工具,以及 TypeScript 的完整支持。Developer Community 版本的 WebStorm 也可以在本地设备上免费使用。

  3. Atom:Atom 是一款开源文本编辑器,由 Github 开发和发布,并且提供了丰富的插件和主题。可以安装 atom-typescript 插件,来添加对 TypeScript 的直接支持。

  4. Eclipse:Eclipse 是一款广泛使用的集成开发环境,可适用于各种编程语言。可以使用 Nodeclipse 插件支持 TypeScript。

  5. Sublime Text 3:Sublime Text 3 是一个高度可定制的文本编辑器,并且允许使用 Package Control 插件来扩展其功能。可安装 TypeScript 插件,实现对 TypeScript 的支持。

总的来说,使用 TypeScript 的好处是它可以提供更好的代码可读性和可维护性。无论你使用哪种 IDE,TypeScript 的集成只需要简单的步骤,以便更高效的创建高质量的 TypeScript 应用程序。

编译 TypeScript

TypeScript 代码需要被编译成可运行的 JavaScript 代码,因为浏览器和 Node.js 无法直接运行 TypeScript。

以下是一些编译 TypeScript 的方法:

  1. 使用 tsc 命令行:TypeScript 提供了一个名为 tsc 的命令行工具,将 TypeScript 文件编译成 JavaScript 文件。在命令行中,输入以下命令编译 TypeScript 文件:
tsc filename.ts
  1. 使用 tsconfig.json:tsconfig.json 是 TypeScript 的配置文件,通过配置 tsconfig.json 文件,可以批量编译多个 TypeScript 文件。可以通过命令行输入以下命令编译整个项目:
tsc

这将编译 tsconfig.json 中指定的所有 TypeScript 文件。

  1. 使用插件:许多代码编辑器都提供 TypeScript 插件,它们可以自动编译 TypeScript 文件。例如,Visual Studio Code 可以使用 TypeScript 插件自动编译 TypeScript 文件,并在保存时自动进行编译。

以上是几种编译 TypeScript 的方法。为了更高效地编写 TypeScript 代码,推荐使用 tsconfig.json 文件来编译整个 TypeScript 项目。

III. TypeScript 基础

TypeScript 数据类型

在 TypeScript 中,数据类型依据值的类型进行分类,主要包括以下类型:

  1. 布尔型(Boolean):表示 true 或 false 值。

  2. 数值型(Number):表示整数或浮点数,使用 number 关键字声明。

  3. 字符串型(String):表示文本或字符,使用 string 关键字声明。

  4. 数组(Array):表示由同一种数据类型元素组成的有序集合。声明数组时,在变量名后加上 [] 括号。

  5. 元组(Tuple):表示由不同类型的元素组成的有序集合。元组使用数组的语法,但是元素使用不同类型。

  6. 枚举(Enum):表示具有特定命名值的一组关联值。枚举可以使用 enum 关键字定义。

  7. Any:表示任意类型的值。使用 any 关键字声明。

  8. Void:表示没有返回值的函数。使用 void 关键字声明。

  9. Null 和 Undefined:表示 null 或 undefined 值。使用 null 和 undefined 关键字声明。

  10. Never:表示永远不会出现的值。通常用于抛出异常或无限循环。

  11. Object:表示非原始类型的类型。如对象、函数、数组和类等数据类型。使用 object 关键字声明。

以上是 TypeScript 中常用的数据类型。使用正确的数据类型可以提高代码的可读性和性能,并且避免在代码运行时出现错误。

TypeScript 的变量和常量

在 TypeScript 中,有两种声明变量的方式:使用 var 和使用 let 关键字。在 ES6 中,let 关键字是引入的,它是块级作用域。除了使用 var 和 let 之外,还可以使用 const 关键字来声明常量,一旦赋值之后值不会改变。以下是这三种声明方式的例子:

  1. 使用 var 关键字:
var x = 10;
function example() {
  var y = 2;
}
console.log(x); // 10
console.log(y); // 报错,y 在函数作用域之外不可用
  1. 使用 let 关键字:
let x = 10;
function example() {
  let y = 2;
  if (true) {
    let z = 3;
  }
}
console.log(x); // 10
console.log(y); // 报错,y 在函数作用域之外不可用
console.log(z); // 报错,z 在块级作用域之外不可用
  1. 使用 const 关键字:
const x = 10;
// x = 5; 报错,常量的值一旦被赋值后不能改变

总的来说,使用 let 和 const 关键字声明变量和常量可以避免作用域和重新赋值的问题。在 TypeScript 中,推荐使用 let 和 const 关键字来声明变量和常量,以提高代码的可读性和可维护性。

TypeScript 的函数

在 TypeScript 中,函数是一种非常重要的语言特性。函数是一段可重用的代码块,用于执行某个特定的任务。

以下是 TypeScript 中常用的函数相关的语法:

  1. 声明函数:使用关键字 function 来声明一个函数,可以指定函数的参数和返回值类型。
function add(x: number, y: number): number {
  return x + y;
}
  1. 可选参数和默认值:在 TypeScript 中,在参数名的后面加上 ? 可以使参数变成一个可选参数。可以为函数参数提供默认值,这样在调用函数时如果没有给该参数传值,那么它的默认值就会被使用。
function drawImage(url: string, width?: number, height?: number): void {
  // 使用默认的高度和宽度
  if (!width) {
    width = 100;
  }
  if (!height) {
    height = 100;
  }
  // 加载图像并绘制图像
}
  1. 剩余参数:可以使用剩余参数语法来接受任意数量的参数。
function multiply(multiplier: number, ...theNumbers: number[]): number {
  return theNumbers.reduce((prev, curr) => {
    return prev * curr;
  }, multiplier);
}
  1. 匿名函数和箭头函数:可以使用匿名函数和箭头函数声明函数。
let square = function(x: number): number {
  return x * x;
};

let add = (x: number, y: number): number => {
  return x + y;
};

总的来说,函数是 TypeScript 中的重要组成部分,提供了一种强大、可重用的代码块来执行特定的任务。在声明函数时,可以为函数指定参数和返回值类型,并且可以使用可选参数、默认值、剩余参数、匿名函数和箭头函数等语法。

IV. TypeScript 高级特性

类与面向对象编程

TypeScript 是一种静态类型的开发语言,它是 JavaScript 的超集,可以编写面向对象(OOP)的代码。TypeScript 支持类、继承、抽象类、接口等 OOP 概念,让开发者编写更加结构化和可维护的代码。

下面是 TypeScript 中声明类的基本语法:

class Person {
    firstName: string;
    lastName: string;
    
    constructor(firstName: string, lastName: string) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
    
    getFullName(): string {
        return `${this.firstName} ${this.lastName}`;
    }
}

上面的代码定义了一个名为 Person 的类,它拥有两个公共的属性 firstNamelastName,还有一个构造函数用来初始化这两个属性。getFullName() 是一个公共方法,用来返回 Person 实例的全名。

接下来是如何创建 Person 类的实例:

const person = new Person('John', 'Doe');
console.log(person.getFullName());

上面的代码会输出 John Doe

继承是面向对象编程的一个重要概念, TypeScript 也支持类继承。下面是一个继承案例:

class Employee extends Person {
  companyName: string;

  constructor(firstName: string, lastName: string, companyName: string) {
    super(firstName, lastName);
    this.companyName = companyName;
  }

  getFullName(): string {
    return `${super.getFullName()} - ${this.companyName}`;
  }
}

上面的代码定义了一个名为 Employee 的类,继承自 Person 类。Employee 类有一个新的属性 companyName,还有一个构造函数和一个重写的 getFullName() 方法。

现在我们可以创建 Employee 类的实例:

const employee = new Employee('John', 'Doe', 'ABC Corp');
console.log(employee.getFullName());

上面的代码会输出 John Doe - ABC Corp

TypeScript 的面向对象编程概念还包括抽象类、接口、访问修饰符等,这些概念能够协助开发者管理类的状态和行为,让代码更加清晰易懂。

类型注解

TypeScript 具有静态类型检查的特性,它可以使用类型注解来明确变量、参数、函数等的类型。此外,类型注解还可以提高代码可读性和可维护性,减少类型相关的错误。

下面是一些基本的类型注解例子:

// 声明变量 age 为 number 类型
let age: number = 30;

// 声明数组 numbers 中每个元素都为 number 类型
let numbers: number[] = [1, 2, 3, 4];

// 声明对象 person 中的属性 firstName 和 lastName 分别为 string 类型
let person: { firstName: string, lastName: string } = { firstName: 'John', lastName: 'Doe' };

// 声明函数 getFullName 参数 firstName 和 lastName 都为 string 类型,返回 string 类型
function getFullName(firstName: string, lastName: string): string {
  return `${firstName} ${lastName}`;
}

当类型注解不匹配时,TypeScript 会给出类型错误提示。例如,下面的代码会在编译时报错:

let name: string = 'John';
// 下面这行代码会编译时错误,因为 'number' 类型不能赋值给 'string' 类型
name = 30;

除了上述的基本类型,TypeScript 还提供了很多内置类型和高级类型,例如元组、枚举、联合类型、交叉类型等。使用这些类型注解,可以让开发者更好地管理和维护代码。

泛型

TypeScript 中的泛型(Generics)是实现可重用性的一种强大工具,它可以用来创建具有灵活参数类型的函数、类和接口。泛型可以让代码变得更加可读、可维护和可扩展。

下面是一个简单的泛型函数示例:

function getArray<T>(items: T[]): T[] {
  return new Array().concat(items);
}

let numArray: number[] = [1, 2, 3, 4];
let strArray: string[] = ['one', 'two', 'three'];

let concatNumArray: number[] = getArray<number>(numArray);
let concatStrArray: string[] = getArray<string>(strArray);

上面的代码使用了一个泛型函数 getArray,它接受一个类型为 T 的数组 items 作为参数,然后返回一个类型为 T 的新数组。在上面的调用中,我们分别使用了 number 和 string 作为类型参数调用了 getArray 函数,返回了新的数组类型。

除了泛型函数,TypeScript 中还有泛型类和泛型接口。下面是一个泛型类示例:

class Queue<T> {
  private data: T[] = [];

  push(item: T) {
    this.data.push(item);
  }

  pop(): T | undefined {
    return this.data.shift();
  }
}

let q = new Queue<number>();
q.push(1);
q.push(2);
console.log(q.pop()); // output: 1
console.log(q.pop()); // output: 2

上面的代码展示了一个名为 Queue 的泛型类,它包含一个私有数据成员 data 和两个方法 pushpop。可以看到,在实例化 Queue 类时,我们可以指定泛型类型为 number,然后向队列中加入了两个 number 类型的元素。最后通过 pop 方法分别弹出两个元素并打印结果。

通过泛型,TypeScript 可以实现更加灵活的代码类型,便于复用和维护,适用于多种场景。

接口

TypeScript 中的接口是一种定义代码契约、规范行为的方式,它主要用于描述对象的形状和行为。接口可以让开发者明确代码的输入和输出,提高代码的健壮性和可读性。

下面是一个基本的接口示例:

interface IPerson {
  firstName: string;
  lastName: string;
  age: number;
}

function greet(person: IPerson) {
  console.log(`Hello, ${person.firstName} ${person.lastName}!`);
}

let user = { firstName: 'John', lastName: 'Doe', age: 30 };
greet(user);

上面的代码中,我们定义了一个名为 IPerson 的接口,它包含三个属性:firstNamelastNameage。然后我们定义了一个名为 greet 的函数,它接受一个类型为 IPerson 的参数,函数内部根据传入参数输出字符串。最后我们定义了一个变量 user,它包含了 firstNamelastNameage 三个属性,并把它传入 greet 函数中。

在 TypeScript 中,接口可以表示更加复杂的对象形状,包括可选属性、只读属性、函数类型和继承等。例如,下面是一个包含可选属性和函数类型的接口示例:

interface IEmployee {
  firstName: string;
  lastName: string;
  age?: number;
  getFullName: () => string;
}

let employee: IEmployee = {
  firstName: 'John',
  lastName: 'Doe',
  getFullName: function() {
    return `${this.firstName} ${this.lastName}`;
  }
};

console.log(employee.getFullName()); // output: John Doe

上面的代码中,我们定义了一个名为 IEmployee 的接口,其中 age 属性是可选的,getFullName 属性是函数类型。然后我们创建了一个名为 employee 的对象,它包括 firstNamelastNamegetFullName 三个属性,并通过 getFullName 属性返回了全名字符串。

总之,接口是一种强大的代码规范和约束方式,能够提高代码的可读性、可维护性和可扩展性,适用于多种场景。

V. TypeScript 应用

与框架集成(如 Vue.js、React)

TypeScript 可以与各种框架集成,使开发者能够使用 TypeScript 强大的类型检查和自动补全功能,提高代码可靠性和开发效率。

下面是一些 TypeScript 与常见框架集成的简单示例:

TypeScript 与 Vue.js 集成

在 Vue.js 中使用 TypeScript 可以提供更加明确的代码类型和语法检查,通过安装 Vue.js 的官方插件 vue-cli-plugin-typescript 可以轻松的将 Vue.js 与 TypeScript 集成。同时,Vue.js 的文档中也提供了 TypeScript 的使用指南。

使用 TypeScript 和 Vue.js 来编写一个简单的组件:

<template>
  <div>
    <p>{{ message }}</p>
  </div>
</template>

<script lang="ts">
import { Component, Vue } from 'vue-property-decorator';

@Component
export default class MyComponent extends Vue {
  private message = 'Hello, World!';
}
</script>

上面的代码采用了 TypeScript 语法,使用了 Vue.js 的装饰器 @Component,声明了一个名为 MyComponent 的组件,并给出了一个私有的属性 message 并赋值为字符串。

TypeScript 与 React 集成

在 React 中可以通过多种方式使用 TypeScript,例如使用 create-react-app 来创建一个基于 TypeScript 的项目框架,或者手动配置 TypeScript 和 React 的集成环境。React 提供了完整的官方文档来说明如何使用 TypeScript 构建 React 应用。

create-react-app 为例,创建基于 TypeScript 的 React 应用框架示例:

npx create-react-app my-app --typescript

然后创建一个名为 MyComponent 的 React 组件:

import React from 'react';

interface IProps {
  message: string;
}

const MyComponent: React.FC<IProps> = ({ message }) => {
  return (
    <div>
      <p>{message}</p>
    </div>
  );
};

上面的代码采用了 TypeScript 语法,定义了一个名为 IProps 的接口,表示 MyComponent 组件的属性类型。通过使用 React.FC 泛型来使用这个接口,使得 MyComponent 组件接收一个名为 message 的字符串类型的属性,返回一个包含一个 p 标签的 div 元素并输出 message 属性的内容。

结论:

TypeScript 可以与各种框架集成,例如 Vue.js、React、Angular 等,使开发者能够使用 TypeScript 强大的类型检查和自动补全功能来提高代码可靠性和开发效率,适合于大型和复杂的应用程序开发。

常见应用场景

TypeScript 在以下场景中拥有较为广泛的应用:

  1. 大型应用程序开发:对于复杂的应用程序(例如企业级应用),TypeScript 提供了静态类型检查、自动补全、错误提示等功能,有利于提高代码的可维护性和开发效率。

  2. 与流行框架的集成:TypeScript 可以与流行的 JavaScript 框架和库(例如 React、Angular、Vue)集成,提供更加丰富的类型信息和自动化的代码提示,有利于减少代码错误和提高开发效率。

  3. 组件库开发:TypeScript 提供了接口、泛型等特性,有利于开发组件库、库文件等扩展性强的代码。使用 TypeScript 能够确保组件的可复用性、易维护性和健壮性。

  4. 工具库、游戏引擎开发:TypeScript 提供了面向对象编程的特性,能够方便地编写类库和游戏引擎,有助于提高项目的可扩展性和可维护性。

总之,TypeScript 可以被广泛应用于各种类型的项目开发中,提高代码的可靠性、可读性和可维护性,适用于大多数的 Web 开发项目。

案例分析

下面是两个 TypeScript 应用案例的简介:

  1. Angular

Angular 是 Google 推出的一款前端 MVC 框架,它完全采用 TypeScript 编写。Angular 提供了非常完整的组件化开发框架,拥有很高的可复用性和可维护性。Angular 的 TypeScript 特性,如静态类型检查、类型推导等等,能够大大提高代码的可读性和可维护性。

  1. NestJS

NestJS 是一个用于构建可扩展和高效的 Web 应用程序的 Node.js Web 框架,它使用 TypeScript 编写。NestJS 借鉴了 Angular 中的设计思路和模式,提供了类似 Angular 的装饰器、依赖注入和模块化编程的方案,使得开发者能够更快速、高效地构建 Node.js 应用程序。

总体来说,TypeScript 能够在多个领域发挥作用,提高代码的可扩展性和可维护性,同时也能增强开发者对代码的把控和安全性。无论是大型前端框架还是后端 Node.js 应用程序,都可以通过 TypeScript 发挥技术和业务价值。

VI. TypeScript 最佳实践

编写 TypeScript 代码的建议

下面是一些编写 TypeScript 代码的建议:

  1. 熟悉 JavaScript 基础语法和特性:TypeScript 基于 JavaScript,因此需要对 JavaScript 基础语法和特性有一定的掌握。如果你对 JavaScript 不熟悉,建议先学习 JavaScript,然后再来学习 TypeScript。

  2. 掌握 TypeScript 特有语法:TypeScript 中有很多 JavaScript 没有的特性,如类型声明、类型推断、枚举、泛型等。掌握这些特性,并在项目中合理派用,能够提高开发效率和代码可读性。

  3. 编写详细的类型声明:TypeScript 最大的特色就是类型检查,因此在编写代码时,一定要写出详细的类型声明。这有助于避免一些错误,并增强代码的可读性和可维护性。

  4. 合理利用 TypeScript 的工具和插件:TypeScript 有很多工具和插件可以提供代码补全和错误检查,如 VS Code 自带的 TypeScript 插件。合理使用这些工具和插件可以提高代码质量,减少错误,提高效率。

  5. 使用现有的 TypeScript 类型库:TypeScript 社区中有很多常用的类型库,如 @types/node、@types/react 等等。使用这些类型库可以大大提高编写代码的效率,同时也能够减少一些错误和 bug。

  6. 熟悉 TypeScript 的工作原理:熟悉 TypeScript 的编译过程,知道 TypeScript 是怎样将源代码转换为 JavaScript 代码,能够更好地理解代码的语义,并更好地优化代码。

总之,编写 TypeScript 代码需要一定的 JavaScript 基础和 TypeScript 特性的掌握,同时需要写出详细的类型声明,合理利用 TypeScript 的工具和插件,并熟悉 TypeScript 的编译过程。

TypeScript 代码风格指南

以下是一些遵循良好的 TypeScript 代码风格的指南:

  1. 使用 PascalCase 命名法:对于类、接口、枚举等,建议使用 PascalCase 命名法,即单词首字母大写的格式;对于变量、函数等,建议使用 camelCase 命名法,即首字母小写的格式。

  2. 确保类型声明的一致性:在 TypeScript 中,类型声明是重要的。因此在使用类型时,要确保类型的一致性,以避免可能的错误,同时提高代码的可读性和可维护性。

  3. 嵌套类型声明的缩进:对于多层嵌套的类型声明,建议使用缩进来表达类型之间的继承和关系,这有助于提高代码的可读性。

  4. 组件属性的字母顺序:对于 ReactAngular 等组件框架,建议按照字母顺序排列组件属性,这有助于减少重复名称和提高代码可读性。

  5. 使用泛型和类型别名:在 TypeScript 中,泛型和类型别名可以帮助我们更好的抽象和封装代码。使用泛型和类型别名能够更好地表达代码中的概念和逻辑,并提高代码的可读性和可维护性。

  6. 编写清晰的注释:虽然 TypeScript 可以提供类型检查和自动补全等功能,但是对于一些复杂的代码逻辑或者语义不明确的地方,建议编写清晰的注释,以便更好地理解代码。

  7. 代码格式化:使用代码格式化工具来保持代码风格的一致性,这对于团队协作、代码维护和可读性至关重要。

总之,遵循良好的 TypeScript 代码风格可以提高代码的可读性、可维护性和可扩展性,同时也能够更好地协作和构建具有高质量的代码库。

TypeScript 与 JavaScript 兼容性问题处理

TypeScript 与 JavaScript 的兼容性问题主要体现在两个方面:

1. TypeScript 编译后的 JavaScript 代码是否能够运行在原生的 JavaScript 环境中。

解决方案:TypeScript 支持通过编译选项配置目标 JavaScript 版本。通过指定目标 JavaScript 版本,可以确保生成的 JavaScript 代码能够在目标环境中运行。同时,TypeScript 还提供了对 ES5、ES6、ES7 的语言特性支持,可以根据实际项目需求选择相应的编译选项。

2. JavaScript 库或框架中的声明文件与 TypeScript 声明文件不一致,导致类型错误和运行时错误。

解决方案:一种方法是使用第三方库的 TypeScript 版本,如果不存在,则自己创建类型声明文件,或者使用第三方提供的类型声明文件。

另外,建议在使用 JavaScript 库或框架时,尽量避免使用 any 类型,以避免类型错误和难以维护的代码。可以通过为第三方库编写类型声明文件的方式来避免 any 类型的使用。

总之,TypeScript 和 JavaScript 之间的兼容性问题可以通过相应的编译选项和类型声明文件来解决。同时,尽可能减少对 any
类型的使用也可以提高代码质量和可读性。

VII. TypeScript 工具

TypeScript 异步控制工具

以下是几个 TypeScript 中常用的异步控制工具:

1. Promise

Promise 是 ES6 中引入的一种异步编程解决方案。在 TypeScript 中,可以借助 Promise 来处理异步任务的完成和失败,使得代码更加易读和易维护。

2. Async/Await

Async/Await 是 ES2017 中引入的一种异步编程解决方案,可以直接处理基于 Promise 的异步操作。在 TypeScript 中,可以使用 Async/Await 语法来进行同步式的异步编程,简化代码结构,提高代码质量。

3. RxJS

RxJS 是一个使用 Observables 来处理异步和事件的库。Observables 是表示异步数据流的对象,具有强大的操作符和方法来处理数据的变换和流控制。因此,在 TypeScript 中使用 RxJS 可以极大地简化异步操作的代码,同时也提供了更多的数据流处理的能力。

4. Bluebird

Bluebird 是一个 Promise 库,支持 Promise 的链式调用、多个 Promise 的并行和序列等操作。在 TypeScript 中使用 Bluebird 可以让我们更好地控制 Promise 的流程,从而简化异步异步程序的编写。

综上所述,以上这些工具都是 TypeScript 中常用的异步控制工具,可以让我们更好地处理异步任务。在选择工具时,可以根据实际需求选择合适的工具,以便提高代码质量、可读性和可维护性。

TypeScript 单元测试工具

以下是常用的 TypeScript 单元测试工具:

1. Jest

Jest 是一个流行的 JavaScript 单元测试框架,可以用于测试 JavaScript 和 TypeScript 代码。它具有简单易用、快乐生产、提供了覆盖率报告、支持并发测试等特点。Jest 可以很容易地集成 CI/CD 工具,并在开发过程中持续运行测试,并报告任何可能的错误。

2. Mocha

Mocha 是另一个流行的 JavaScript 单元测试框架,它可以用于测试 JavaScript 和 TypeScript 代码。它具有支持任何断言库、支持异步和同步代码测试、易于扩展等特点。Mocha 还支持在浏览器和 Node.js 环境中运行测试。

3. Chai

Chai 是一个可扩展的 BDD/TDD 断言库,可以与 Mocha 和其他 JavaScript 测试框架一起使用。Chai 具有灵活的语法和支持链式表达式等优点,可以帮助我们更好的编写测试代码,以确保代码质量和可读性。

4. Sinon

Sinon 是一个 JavaScript 测试工具库,可以帮助我们模拟对象、函数和 API 调用。在 TypeScript 中,我们可以使用 Sinon 来测试异步代码、模拟函数的返回值和异常等。

5. Testcafe

Testcafe 是一个跨平台自动化浏览器测试工具。它可以在真实的浏览器中运行测试,以提供最真实的测试结果。Testcafe 也支持 TypeScript,在测试代码中具有类型检查的能力。

总之,以上这些工具都可以用于 TypeScript 单元测试,我们可以根据实际需求选择适合的工具。无论是 Jest、Mocha 还是 Chai、Sinon,甚至是 Testcafe,它们都有着强大的测试和断言能力,帮助我们更好地测试我们的 TypeScript 代码。

TypeScript 依赖注入工具

以下是常用的 TypeScript 依赖注入工具:

1. InversifyJS

InversifyJS 是一个轻量级的 TypeScript 依赖注入库,它可以帮助我们轻松地进行依赖注入和控制反转,以便更好地组织我们的应用程序。其特点包括基于装饰器注入、支持异步加载、可扩展和易于调试等。

2. tsyringe

tsyringe 是另一个轻量级的 TypeScript 依赖注入工具,它提供了基于装饰器和类型元数据的依赖注入机制,以及类型安全、可配置和可扩展的特性。tsyringe 还支持实例范围、生命周期、条件注入和延迟加载等高级特性。

3. Awilix

Awilix 是一个功能齐全的 JavaScript 依赖注入库,可以完美地支持 TypeScript。它提供了类似 InversifyJS 和 tsyringe 的基于装饰器的注入机制,以及可扩展、可测试和可配置的特性。Awilix 还可以与其他 JS 技术,如 Express、Passport 和 Socket.IO,无缝集成。

4. Nest

Nest 是一个基于 Node.js 和 TypeScript 的应用程序框架,致力于提供高层次的抽象和易于开发的解决方案。Nest 内置了一个依赖注入容器,可以直接支持控制反转和依赖注入,而不需要使用第三方库。

总之,以上这些工具都是常用的 TypeScript 依赖注入工具,我们可以根据实际需求选择适合我们的工具。无论是 InversifyJS、tsyringe,还是 Awilix 和 Nest,它们都有着不同的优点和特点,可以帮助我们更好地组织和管理我们的应用程序代码。

VIII. TypeScript 未来发展

TypeScript 的发展趋势

以下是 TypeScript 的发展趋势:

1. 与 React、Angular、Vue 等前端框架一起使用

由于 TypeScript 具有类型安全、可读性和可维护性等特点,与 React、Angular、Vue 等前端框架一起使用的趋势将会继续发展。React、Angular、Vue 三大框架都对 TypeScript 的支持不断增强,许多流行的 UI 库和组件库已经开始采用 TypeScript 进行开发和维护。

2. 实现更好的类型系统和编译器特性

TypeScript 已经拥有了强大的类型系统和编译器特性,而未来的发展趋势将集中在使它们更好,并进一步提高代码质量和开发效率。例如,TypeScript 的类型系统可以进一步支持对连锁方法、装饰器、解构等高级语言特性的类型推导和检查。

3. 集成更多的编辑器和 IDE

TypeScript 已经得到了许多流行的编辑器和 IDE 的支持,例如 VS Code、WebStorm、Atom 等等。未来,TypeScript 可能会更多地与其他工具和平台进行集成,以进一步提高开发效率、便捷性和可读性。

4. 支持 WebAssembly

WebAssembly 是一种低级别的字节代码格式,目前已经得到了越来越广泛的支持。TypeScript 可能会在未来支持 WebAssembly,从而让开发者能够更加轻松地编写和调试 WebAssembly 应用程序。

综上所述,TypeScript 的发展趋势是与前端框架一起使用、实现更好的类型系统和编译器特性、集成更多的编辑器和 IDE,以及支持 WebAssembly。这些趋势将进一步提高 TypeScript 的普及率和应用场景,帮助开发者更高效地编写高质量的应用程序。

TypeScript 对企业级应用的贡献

TypeScript 对企业级应用的贡献主要体现在以下几个方面:

1. 可维护性和代码质量

TypeScript 的类型系统可以帮助开发者更好地描述和控制代码行为,减少代码中的潜在错误和漏洞。TypeScript 还提供了一系列的开发工具和功能,如类型推导、高级语法和编辑器工具支持,这些都可以帮助开发者更好地管理和维护企业级应用,提高代码质量和可维护性。

2. 可读性和可扩展性

TypeScript 的类型注解和代码结构可以帮助人类开发者更好地理解和阅读代码,使得代码更加易于理解和扩展。TypeScript 还提供了与现代前端框架(如 React、Vue、Angular)和后端系统(如 Node.js)进行深度集成的能力,使得开发者可以更好地利用现有的工具和技术来开发企业级应用。

3. 生态和社区

TypeScript 的持续发展和社区推动也为企业级应用的发展做出了贡献。TypeScript 有一个庞大的社区和生态系统,开发者可以在这个社区中找到大量的支持、文档、教程、工具和解决方案,以满足日益增长的企业需求。

4. 敏捷开发和自动化测试

TypeScript 的静态类型系统可以帮助开发者更好地理解软件代码和架构,同时也可以快速识别代码中的错误和故障。这些特性还可以帮助企业在软件开发和自动化测试方面更加运用敏捷开发和DevOps实践,以加快软件应用的交付和上线速度。

综上所述,TypeScript 对企业级应用的贡献主要包括提高可维护性和代码质量、提高可读性和可扩展性、为企业级应用提供具有价值的生态和社区,以及支持敏捷开发和自动化测试。这些贡献使得企业级应用可以更加高效、可靠和安全地运转,满足企业级应用的需求。

TypeScript 与JavaScript的趋势比较

TypeScript 和 JavaScript 均为主流的编程语言,各自有着不同的应用场景和发展趋势。

以下是 TypeScript 与 JavaScript 的趋势比较:

1. 类型系统

TypeScript 与 JavaScript 最大的差异在于类型系统,TypeScript 进一步强化了 JavaScript 的类型系统,使得开发者能够更加准确和安全地编写代码。随着 TypeScript 的不断发展,类型系统将成为 TypeScript 与 JavaScript 的又一重要区别。

2. 支持 frameworks

TypeScript 目前得到了 React、Vue 和 Angular 等流行的前端框架的广泛支持,这些框架提供了更多的Typing和其他TypeScript功能。与此相比,JavaScript 的支持范围更广,无论前后端开发和框架都可以使用。

3. 社区生态

JavaScript 已经拥有了一个经过多年发展的社区和生态系统,在许多项目中都得到了广泛的应用和支持。然而,TypeScript 在近年来也逐渐发展壮大,拥有庞大的社区和生态系统,并且正在获得更多的关注和应用。

4. 学习成本

由于 TypeScript 是建立在 JavaScript 基础之上进行扩展的,因此学习 TypeScript 的过程会比学习 JavaScript 的过程更具挑战性。需要掌握更多的 TypeScript 语言特性和类型系统,此外还需要大量的实践和训练来应对类型推导和类型判断等问题。

综上所述,TypeScript 和 JavaScript 都有着各自的优点和特点。TypeScript 发展的趋势是越来越好的类型系统、更广泛的框架和生态支持,而 JavaScript 发展的趋势则主要体现在更普及和更广泛的应用场景。在实际应用中,我们可以根据项目的具体需求选择 TypeScript 或 JavaScript,或者两者结合使用,以便更好地满足应用程序的需求。

IX. 结论

TypeScript 的优点

以下是 TypeScript 的优点:

1. 更好的可读性和可维护性

TypeScript 引入了类型注解和类的概念,可以显著提高代码的可读性和可维护性。这些特性可以让开发者更好地了解代码的行为,同时也可以排除一些常见的编程错误。

2. 更安全的编程环境

TypeScript 可以通过类型检查,避免在代码中出现类型错误,在编码阶段就暴露一些潜在的问题,可以避免一些错误在运行时才出现,提高了代码的稳定性和可靠性。同时,TypeScript 还可以减少由于类型转换错误导致的运行时错误,提高代码的安全性。

3. 更好的 IDE 支持

TypeScript 可以提供比 JavaScript 更好的类型验证,所以绝大部分 IDE 可以对 TypeScript 进行语法和类型补全。这样可以在编码过程中减少手动输入和抵御语法错误,从而提高开发效率。

4. 更好的与第三方库的集成

现在大量的 JavaScript 库已经使用 TypeScript 进行开发,很多流行的前端框架和库,包括 React、Angular 和 Vue,都对 TypeScript 的支持非常友好。使用 TypeScript 可以更好地集成这些第三方库和框架,同时保持类型安全和可维护性。

5. 更快的开发速度和更少的错误

TypeScript 可以提高开发团队的效率,同时也能够减少代码中的错误,降低修复错误的成本和时间。与传统的 JavaScript 相比,TypeScript 精准的类型检查和更好的可组合性可以在项目开发中更自信地进行迭代和协作。

综上所述,TypeScript 具有更好的可读性和可维护性、更安全的编程环境、更好的 IDE 支持、更好的第三方库的集成以及更快的开发速度和更少的错误等优点。这些优点使得 TypeScript 在日益增长的应用场景中被广泛应用,可为企业级应用和后端项目节省大量时间和资源。

其他编程语言与 TypeScript 的比较

TypeScript 作为一门面向对象和静态类型的编程语言,与其他编程语言有着一些共性和差异。

  1. 与 JavaScript 的比较

TypeScript 是基于 JavaScript 的一种超集,它扩展了 JavaScript 的基础类型系统和语法,提高了代码的可读性和可维护性。TypeScript 支持与 JavaScript 代码无缝协作,并且可以直接编译成 JavaScript 代码运行在浏览器或者 Node.js 环境中。

  1. 与 Java 的比较

与 Java 不同的是,TypeScript 是一种面向对象语言,但是它不像 Java 那样强制使用类和接口来构造对象,而是允许使用更加灵活的类型和架构。此外,TypeScript 拥有更短的开发环节、更容易学习、更少的等待时间、更强大的 IDE 支持以及更丰富的社区支持等优点。

  1. 与 Python 的比较

与 Python 相比,TypeScript 拥有更加强大的类型系统和静态类型检查,可以帮助开发者避免在使用时出现一些类型和语法错误,并且可以提供更好的 IDE 支持。Python 拥有更好的科学计算、人工智能等方面的扩展库和生态支持。

  1. 与 C# 的比较

TypeScript 和 C# 都是由 Microsoft 开发和维护的编程语言,它们有许多共性,例如静态类型检查、强类型和面向对象等特点。相比于 C#,TypeScript 更加轻量、便捷、灵活,开发团队需要考虑更多的开发效率和代码的可读性。

综上所述,TypeScript 与 JavaScript、Java、Python 和 C# 等语言有许多相似性和差异性。相互比较时需要考虑每种语言的特点和使用环境,选择最适合当前项目的语言。

使用 TypeScript 的建议

以下是使用 TypeScript 时的一些建议:

1. 评估项目框架和技术栈

在使用 TypeScript 之前,需要考虑项目的框架和技术栈是否支持 TypeScript。通常,大多数流行的前端框架和库,包括 React、Vue 和 Angular 都对 TypeScript 的支持非常友好。同时也需要考虑是否使用 TypeScript 对于团队或项目具有助益。

2. 开启严格模式

TypeScript 严格模式(strict mode)可以让 TypeScript 提供更强的类型推断和类型检查,从而减少代码中的错误和漏洞。建议项目初期就开启严格模式,确保代码的质量和稳定性。

3. 确定合适的类型

TypeScript 可以为变量、函数、对象和属性定义类型,建议在编写代码时使用合适的类型。这样可以提高代码的清晰度和可读性,并且可减少一些开发中的错误。

4. 学习 TS 的特性

学习 TypeScript 的特性和语法是使用 TypeScript 的关键,建议利用在线资源或书籍系统地学习 TypeScript。掌握更多的 TypeScript 特性,使其成为企业级应用的基础。

5. 利用 TypeScript 工具和插件

TypeScript 支持许多优秀的工具和插件,包括编译器、代码检查器、自动补全等。合理的使用这些工具和插件可以大大提高开发者的开发效率和代码质量。

综上所述,使用 TypeScript 需要考虑项目框架和技术栈的适配性,建议开启严格模式、确定合适的类型、充分了解 TypeScript 的特性,以及利用 TypeScript 工具和插件来协助开发。这些建议可以使开发者更好地利用 TypeScript 来提高项目质量,并帮助团队更好地管理和维护代码库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/561380.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nginx(四)

部署LNMP架构动态网站WordPress LNMPLinuxNginxMySQLPhp 环境 192.168.29.141centos8Nginx1.24.0192.168.29.142centos8MySQL8.0.33192.168.29.143centos8Php7.2.24 关闭firewalld systemctl stop firewalld systemctl disable firewalld 关闭selinux setenforce 0 sed -ir…

网络原理(六):http 协议(上)

目录 HTTP 协议是什么 抓包工具 Fiddler 的下载 使用Fiddler HTTP 请求 (Request) HTTP 请求格式 首行 请求头&#xff08;Header&#xff09; Cookie HTTP 协议是什么 还是老样子&#xff0c;在讲解http 之前我们先来了解以下什么叫做 http 。 HTTP&#xff08;Hyp…

使用百度 PaddleOCR对身份证识别的简单处理

一&#xff1a;引言 本文才用百度的PaddleOCR对身份证进行识别的处理&#xff0c;由于直接使用并未进行对跟多数据集进行训练&#xff0c;当前的效果是对非少数民族的身份证识别率可以达到85%以上&#xff0c;同时要求身份证图片是正面且相对清晰。否则效果不理想&#xff0c;本…

基于java的时间管理系统的设计与实现

背景 要设计一个时间管理系统&#xff0c;通过这个系统能够满足时间管理的管理功能。系统的主要功能包括首页&#xff0c;个人中心&#xff0c;系统公告管理&#xff0c;用户管理&#xff0c;时间分类管理&#xff0c;事件数据管理&#xff0c;目标数据管理&#xff0c;用户日…

【系统软件】源码编译安装ZLIB——Could NOT find ZLIB(missing:ZLIB_LIBRARY ZLIB_INCLUDE_DIR

【系统软件】源码编译安装ZLIB——Could NOT find ZLIB(missing:ZLIB_LIBRARY ZLIB_INCLUDE_DIR 前言一、简介二、源码下载三、解压、构建四、编译五、安装六、安装成功后如下图七、如何使用zlib中的include 前言 今天原本打算源码编译安装protobuf&#xff0c;但是在构建项目…

图神经网络GNN GCN AlphaFold2 虚拟药物筛选和新药设计

文章目录 图神经网络1. Geometric Deep LearningRepresentation learning 表征学习机器学习的数据类型&#xff1a;序列、网格、图引出GNN 2. Graph Neural NetworksMachine Learning Lifecyclelearning graph is hardFeature Learning in GraphsWays to Analyze NetworksA Nai…

chatgpt赋能Python-python_plot标题

Python Plot 标题&#xff1a;如何让你的数据可视化更加引人注目 Python是数据科学和可视化领域中最受欢迎的编程语言之一。Python的可视化库让数据可视化变得非常容易、灵活和美观。 在创建一个数据可视化时&#xff0c;最重要的是让图表或图形作品的标题尽可能引人注目。这…

chatgpt赋能Python-python_plt_标题

Python plt&#xff1a;用Python创建出色的可视化图表 Python是一种广泛使用的高级编程语言&#xff0c;它被用于各种不同的领域&#xff0c;包括Web开发、数据科学、人工智能和计算机视觉等。Python拥有一个强大的生态系统&#xff0c;其中包括了大量的第三方库和工具&#x…

chatgpt赋能Python-python_property描述符

Python Property描述符&#xff1a;什么是Property&#xff1f; 介绍 在Python中&#xff0c;属性是一种非常强大的方式&#xff0c;在代码中隐藏数据并将其保护起来。我们可以使用属性来让代码更可读&#xff0c;更易于维护&#xff0c;并降低代码中的错误风险。 Python中&a…

一、服务端渲染技术NUXT

文章目录 一、服务端渲染技术NUXT1.1 什么是服务端渲染1.2 什么是NUXT 2、NUXT环境初始化2.1 下载压缩包2.2解压2.3修改package.json2.4修改nuxt.config.js2.5终端中进入项目目录安装依赖2.6 引入element-ui2.7 测试运行2.8 NUXT目录结构 3、封装axios3.1 安装axios3.2 封装axi…

抖音矩阵系统开发分析(附代码部分)

简介 本文档旨在介绍抖音SEO源码开发相关内容&#xff0c;包括技术架构、关键模块、实现原理等方面的内容。 技术架构 抖音SEO源码采用的是分布式架构。整个系统可以分为以下几个模块&#xff1a; 数据抓取模块&#xff1a;负责从抖音服务器抓取数据&#xff0c;并进行去重和…

一个公司,一个机器视觉工程师

​一个公司,一个机器视觉工程师。 大家觉得这种公司,这种情况可能很难,很尴尬。 其实一个公司,一个机器视觉工程师,公司业务上是有需求的,多数选择有经验的机器视觉工程师,我遇到的视觉人机器视觉粉丝里面还是比较多的。这样子的公司大多数是选择有经验的机器视觉工程师…

【22-23春】AI作业10-经典卷积网络

1.LeNet & MNIST LeNet是一种神经网络的模型&#xff0c;用于图像识别和分类。他包含 3 个卷积层&#xff0c;2 个池化层&#xff0c;1 个全连接层。其中所有卷积层的所有卷积核都为 5x5&#xff0c;步长 strid1&#xff0c;池化方法都为全局 pooling&#xff0c;激活函数…

一元函数的凹性concavity以及二阶导数

凹性&#xff08;concavity&#xff09;与函数导数的变化率有关。一个函数f是上凹(即抛物线方向开口向上)&#xff0c;其导数f是增函数&#xff0c;也意味着f的导数&#xff08;即f&#xff09;是正数&#xff1b;类似的一个函数f是下凹(即抛物线方向开口向下)&#xff0c;其导…

chatgpt赋能Python-python_plot_标题

Python Plot: 如何更好地可视化你的数据 如果你需要更好地理解你的数据&#xff0c;Python Plot是一个非常好的工具。在这篇文章里&#xff0c;我将向你介绍如何使用Python Plot来可视化你的数据。我们将讨论如何使用Python Plot创建各种不同类型的图形&#xff0c;以及如何使…

chatgpt赋能Python-python_os_system_隐藏cmd窗口

Python os.system函数 在Python中&#xff0c;os.system函数是一个非常常用的系统调用函数。它的作用是执行一个命令行语句。不过&#xff0c;使用os.system函数有时候会出现一个问题&#xff0c;就是会弹出一个命令行窗口。而在一些特殊场合下&#xff0c;我们可能希望这个命…

chatgpt赋能Python-python_plot坐标轴

Python绘图库中坐标轴的设置 介绍 Python是一种简单易学&#xff0c;功能强大的编程语言。它被广泛用于数据科学和可视化领域。Python绘图库中的坐标轴设置可以让我们更好地展示数据&#xff0c;让我们更轻松地理解数据。本篇文章将介绍Python绘图库中坐标轴设置的方法和技巧…

chatgpt赋能Python-python_plt颜色

Python plt颜色详解&#xff1a;掌握常用颜色与自定义颜色的技巧 在数据可视化的过程中&#xff0c;使用合适的颜色方案可以让图表更加清晰、易于理解。Python的matplotlib库中的plt模块提供了丰富的颜色方案供我们使用。在本篇文章中&#xff0c;我们将深入探讨plt颜色的基础…

Microsoft Office 2016安装

哈喽&#xff0c;大家好。今天一起学习的是office2016的安装&#xff0c;有兴趣的小伙伴也可以来一起试试手。 一、测试演示参数 演示操作系统&#xff1a;Windows 10 支持Win7、11安装&#xff0c;不支持WinXP系统 系统类型&#xff1a;64位 演示版本&#xff1a;SW_DVD5_Of…

py实现经典排序之冒泡和快排

文章目录 0、十大经典排序算法0.1 关于时间复杂度0.2 关于稳定性 1、冒泡排序(Bubble Sort)1.1 冒泡排序简介1.2 冒泡排序思路1.3 冒泡排序代码实现 2、快排2.1 快排简介2.2 快排思路2.3 快排代码实现 0、十大经典排序算法 0.1 关于时间复杂度 平方阶 (O(n2)) 排序 各类简单排…