TypeScript | 青训营

62 阅读10分钟

TypeScript 是一种由微软开发的开源编程语言,它是 JavaScript 的一个超集,扩展了 JavaScript 的语法。TypeScript 可以编译成纯 JavaScript,从而可以在任何支持 JavaScript 的平台上运行。下面是 TypeScript 的背景、优缺点和社区活跃度的简要介绍:

背景: TypeScript 最初是由 Microsoft 在 2012 年推出的,旨在解决 JavaScript 在开发大型应用程序时的类型推断问题。JavaScript 是一种动态类型语言,这意味着开发者在编写代码时不需要显式声明变量的类型。然而,随着应用程序变得越来越复杂,JavaScript 的类型推断能力有限,导致开发人员需要手动添加类型注解来提高代码的可读性和维护性。为了解决这些问题,Microsoft 推出了 TypeScript,并将其作为 JavaScript 的一个超集来扩展其功能。

优点:

  1. 强类型检查:TypeScript 通过静态类型检查提供了更好的类型安全性。在开发过程中,TypeScript 会检测到潜在的类型错误,并提供相应的警告信息,帮助开发人员及时发现和修复问题。
  2. 更好的代码可读性:通过使用类型注解,TypeScript 可以提供更清晰的代码结构和语义。开发人员可以明确指定变量、函数参数和返回值的类型,使代码更容易理解和维护。
  3. 面向对象编程支持:TypeScript 支持面向对象编程(OOP)的概念,如类、接口、继承等。这使得开发者可以使用传统的面向对象方式进行开发,并且享受到强类型检查带来的好处。
  4. 模块化支持:TypeScript 支持模块化的开发方式,允许开发者将代码拆分为多个独立的模块,并通过导入和导出机制实现模块之间的交互。这有助于提高代码的可重用性和组织性。
  5. 良好的生态系统:由于 TypeScript 是 JavaScript 的超集,因此它可以与现有的 JavaScript 工具和库无缝集成。许多流行的前端框架(如 Angular、React、Vue.js)都提供了对 TypeScript 的支持,使得开发者能够利用这些框架的强大功能。

缺点:

  1. 编译成本较高:相比于普通的 JavaScript,TypeScript 需要经过编译过程才能生成可在浏览器或 Node.js 环境中运行的代码。这增加了构建时间和资源消耗。
  2. 学习曲线较陡峭:对于已经熟悉 JavaScript 的开发人员来说,学习 TypeScript 可能需要一定的时间和精力。特别是对于那些习惯于直接编写 JavaScript 代码的开发人员来说,可能需要适应 TypeScript 的新语法和特性。
  3. 工具链支持不完善:尽管有许多优秀的 IDE(如 Visual Studio Code)支持 TypeScript,但是在某些情况下(如使用一些较旧版本的编辑器),配置和调试 TypeScript 可能存在一些困难。此外,一些常用的第三方库可能尚未完全支持 TypeScript。

社区活跃度:TypeScript 拥有庞大的社区支持和活跃度。它得到了广泛的应用和推广,许多知名的公司(如 Microsoft、Google、Facebook)都在生产环境中使用 TypeScript。此外,每年都会举办多次相关的技术会议和活动,吸引了众多开发者参与讨论和分享经验。总之,TypeScript 是一个备受关注的技术领域,具有较高的社区活跃度和发展前景。

TS学习网站:一个很好的TS学习网站是:W3Schools 在这个网站上,你可以找到关于TypeScript的教程和示例,从基础知识到高级概念。这个网站适合所有级别的人,因为它的内容简洁易懂。

(板书里的)

TS开源教程及应用

TS到JS在线编译

JS&TS

image.png JavaScript(JS)和TypeScript(TS)都是用于编写Web应用程序的编程语言,但它们之间存在一些关键差异。以下是它们的一些主要区别:

  1. 类型系统:JavaScript是一种动态类型的语言,这意味着在运行时可以更改变量的类型。而TypeScript是一种静态类型的语言,它在编译时检查类型错误,从而提高了代码的健壮性和可维护性。

  2. 类型注解:为了在TypeScript中使用强类型,需要为变量、函数参数和返回值添加类型注解。这些注解在编译时被转换为实际的类型信息。

  3. 类和接口:TypeScript支持类和接口,这使得面向对象编程更加简洁和易于理解。而JavaScript虽然也支持类,但没有内置的接口功能。

  4. 模块系统:TypeScript有一个完整的模块系统,包括导入和导出功能。这使得在大型项目中组织和管理代码变得更加容易。而JavaScript没有内置的模块系统,通常需要使用CommonJS或AMD等模块化方案。

  5. 工具支持:由于TypeScript是JavaScript的一个超集,许多现有的JavaScript开发工具都可以与TypeScript一起使用,如Visual Studio Code、WebStorm等。此外,TypeScript还有一个官方的编译器(tsc),可以将TypeScript代码编译成JavaScript代码。

  6. 兼容性:由于JavaScript已经广泛应用于Web开发,许多库和框架已经针对JavaScript进行了优化。因此,将项目迁移到TypeScript可能会带来一定的兼容性问题。但是,通过使用如Babel这样的转译工具,可以将TypeScript代码转换为兼容旧版本浏览器的JavaScript代码。

Hello, TypeScript!

TypeScript 是一种由微软开发的开源编程语言,它是 JavaScript 的一个超集,添加了静态类型和其他特性。要开始学习 TypeScript,你可以按照以下步骤进行:

  1. 安装 Node.js:访问 nodejs.org/ 下载并安装 Node.js。

  2. 安装 TypeScript:打开命令行工具,输入以下命令安装 TypeScript:

npm install -g typescript
  1. 创建一个 TypeScript 文件:在你的计算机上创建一个新的文本文件,将其扩展名更改为 .ts,例如 helloWorld.ts。在这个文件中,你可以编写一些简单的 TypeScript 代码,如下所示:
function sayHello(name: string): string {
  return `Hello, ${name}!`;
}

const name = 'TypeScript';
console.log(sayHello(name));
  1. 编译 TypeScript 文件:在命令行中,导航到包含 helloWorld.ts 文件的目录,然后运行以下命令以编译 TypeScript 文件:
tsc helloWorld.ts

这将生成一个与你的 TypeScript 文件同名的 JavaScript 文件(在本例中为 helloWorld.js)。

  1. 运行编译后的 JavaScript 文件:在命令行中,运行以下命令以执行编译后的 JavaScript 文件:
node helloWorld.js

你应该会看到输出 "Hello, TypeScript!"。

现在你已经成功创建了一个简单的 TypeScript 程序。

在TS中,有以下几种主要的变量类型

  1. 基本类型:这些是原始类型,包括 booleannumberstringundefinednull,它们分别表示布尔值、数字、字符串、未定义和空。

  2. 枚举类型:这是一组命名的常量集合,每个常量都有一个名称和一个与之关联的值。

  3. 元组(Tuple):元组是一个可以包含任何类型的序列,例如 [1, 2, 'three']

  4. 数组(Array):数组是一种特殊的对象,它包含一系列有序的值。

接口(Interface):接口是一种定义对象结构的方式,它描述了对象应该具有哪些方法和属性。在TS中,可以使用关键字 interface 来定义接口。

类(Class):类是一种用于创建对象的模板。在TS中,可以使用关键字 class 来定义类。

泛型(Generics):泛型是一种允许你在编译时指定数据类型的方法。这使得你可以编写更通用的代码,而不必为每种可能的数据类型编写单独的代码。

下面是一个使用这些类型的简单示例代码:

// 基本类型
let isTrue = true;
let isNumber = 123;
let isString = "hello";
let isUndefined = undefined;
let isNull = null;

// 枚举类型
enum Color { Red, Green, Blue }
let myColor = Color.Red;

// 元组
let myTuple = [1, "two", true];

// 数组
let myArray: number[] = [1, 2, 3];

// 接口
interface Person {
  name: string;
  age: number;
}

// 类
class Car {
  brand: string;
  model: string;
}

// 泛型
function identity<T>(arg: T): T { return arg; } // 一个函数,接受任何类型的参数并返回相同类型的参数。

TS进阶

image.png

TypeScript中的高级类型是指那些可以组合成其他类型的类型。

  1. 联合类型(Union)是一种特殊的数据类型,可以表示多种数据(类型可以相同可以不同,变量名字不同就行)。联合类型的定义方式与结构体是一样的,只是把关键字 struct 改成 union。在语义上,联合类型和结构类型的区别是,联合类型的所有成员占用同一块内存空间,该内存的空间大小是其最大成员的内存空间大小。

下面是一个示例代码,其中包含了一个联合类型的变量和一个函数,该函数接受一个参数并检查它是否为字符串或数字:

union MyUnion {
  string myString: string;
  number myNumber: number;
}

function checkType<T>(value: T): void {
  if (typeof value === 'string' || typeof value === 'number') {
    console.log('The value is a string or a number');
  } else {
    console.log('The value is not a string or a number');
  }
}

let myUnion: MyUnion = { myString: 'hello', myNumber: 42 };
checkType(myUnion.myString); // The value is a string or a number
checkType(myUnion.myNumber); // The value is a string or a number
  1. 交叉类型(Intersection Types)是将多个类型合并为一个类型,这让我们可以把现有的多种类型叠加到一起成为一种类型,它包含了所需的所有类型的特性。例如,Person & Serializable & Loggable 同时是 Person 和 Serializable 和 Loggable。就是说这个类型的对象同时拥有了这三种类型的成员 。

下面是一个示例代码,其中包含了一个交叉类型的变量和一个函数,该函数接受一个参数并检查它是否为 Person、Serializable 或 Loggable 类型:

interface Person {
  name: string;
}

interface Serializable {
  readonly id: number;
}

interface Loggable {
  debug(): void;
}

function checkType<T>(value: T): void {
  if (typeof value === 'object' && value !== null) {
    if (value instanceof Person || value instanceof Serializable || value instanceof Loggable) {
      console.log('The value is a Person, Serializable or Loggable');
    } else {
      console.log('The value is not a Person, Serializable or Loggable');
    }
  } else {
    console.log('The value is not an object');
  }
}

let person: Person = { name: 'John' };
checkType(person); // The value is a Person, Serializable or Loggable
let serializable: Serializable = { id: 1 };
checkType(serializable); // The value is a Person, Serializable or Loggable
let loggable: Loggable = function() {};
loggable.debug(); // The value is a Person, Serializable or Loggable
  1. 类型断言(Type Assertion)是 TypeScript 中的一种语法,用于告诉编译器你比它更了解这个类型,并且它不应该再发出错误。类型断言的一个常见用例是当你从 JavaScript 迁移到 TypeScript 时:
const foo = {};
foo.bar = 123; // Error: 'bar' 属性不存在于 ‘ {}’
foo.bas = 'hello'; // Error: 'bas' 属性不存在于 ' {}'

这里的代码发出了错误警告,因为 foo 的类型推断为 {},即没有属性的对象。 因此,你不能在它的属性上添加 bar 或 bas ,你可以通过类型断言来避免此问题:

const foo = {};
(foo as any).bar = 123; // OK
(foo as any).bas = 'hello'; // OK
  1. 类型别名(Type Alias)是 TypeScript 中的一种语法,用于给一个类型起个新名字。通过类型别名,可以方便将一种类型转换为另一种类型。

下面是一个示例代码,其中包含了一个类型别名和一个函数,该函数接受一个参数并检查它是否为字符串或数字:

type Name = string;
type NameResolver = ( ) => string;
type NameOrResolver = Name | NameResolver;
function getName(n: NameOrResolver): Name {
  if (typeof n === 'string') {
    return n;
  } else {
    return n();
  }
}

泛型是 TypeScript 中的一种创建可复用代码组件的工具。这种组件不只能被一种类型使用,而是能被多种类型复用。类似于参数的作用,泛型是一种用以增强类、类型和接口能力的非常可靠的手段。这样,我们开发者就可以轻松地将那些可复用的代码组件适用于各种输入 。

下面是一个示例代码,其中包含了一个泛型函数和一个泛型类:

function identity<T>(arg: T): T {
  return arg;
}
class Box<T> {
  contents: T;
  constructor(contents: T) {
    this.contents = contents;
  }
}

TypeScript 中有很多泛型工具,例如 TypeScript官方文档、TypeScript教程之泛型、TypeScript泛型详解和TypeScript泛型初探等。这些工具可以帮助你更好地理解和使用泛型。