1. 什么是TypeScript?
      1. TypeScript是基于JavaScript构建的强类型语言,是一个编写更大规模应用的好工具。
      2. TypeScript为JavaScript增加了额外的语法以更加紧密的与编辑器集成,能够在编辑器中显示出现的错误。
      3. TypeScript代码最终会转为JavaScript代码。
      4. TypeScript明白JS代码并且提供了类型接口。
    2. 为什么需要TypeScript
      1. 有利于在编码时发现错误。在编写代码时,最常见的错误就是类型错误,一个类型的数据被用作其他类型。这可能是由简单的书写错误导致,也有可能是对运行时的错误假设。
      2. TypeScript提供了静态检查的功能,保证代码运行时与编写时的设想一致,降低错误概率
    3. TypeScript如何工作的?

    通过了解JavaScript工作原理,ypeScript构建了一个类型系统用于接收JavaScript代码,无需添加任何字符,即可自动推论,在代码中显式显示。如let a = “hello world”, 可以知晓变量a为一个字符串。
    但是一些设计模式使得自动类型推断变得困难,为了解决这种情况,TypeScript提供了JavaScript语言的扩展,提供了告诉TypeScript应该是什么类型的地方。如:

    1. // 直接定义一个对象,需要TypeScript进行自动类型推断
    2. const user = {
    3. name:"wang",
    4. id:0
    5. }
    6. // 我们还可以使用 interface 定义一个类型,来描述这个对象长什么样子
    7. interface User {
    8. name: string;
    9. id: number
    10. }
    11. // 使用 :TypeName 语法,将类型写在变量后面
    12. const user: User = {
    13. name: "li",
    14. id:1
    15. }
    16. // 如果你提供了一个类型定义中不存在的属性,TypeScript将会提醒你
    17. const user: User = {
    18. username: "Hayes",
    19. id: 0
    20. };
    21. // Type '{ username: string; id: number; }' is not assignable to type 'User'.
    22. Object literal may only specify known properties, and 'username' does not exist in type 'User'.
    23. id: 0,
    1. 类型的种类

    可以在interface中使用的除了JavaScript中的基本类型如boolean, bigint, null, number, string, symbol, undefined,还可以使用TS扩展的几个类型如any, unknown, never,void等。

    1. 组合类型
      1. 联合类型-Unions
        1. // 定义为多种类型中的一个
        2. type AddressType = string | string[]
        3. // 定义为多个值中的一个
        4. type LockState = "locked" | "unlocked"

    b. 泛型-Generics
    所谓泛型,是定义一个接口时,暂时不指定其具体类型,用一个符号代替,这个符号是一个可以被替代的变量。就像对Array的类型定义Array, 在时机使用中,我们可以使用let arr = new Array来指定一个数组的元素类型。
    c. 结构化类型系统-Structural Type System
    类型检查的核心原则是聚焦于被检查的值有什么,也叫做“鸭型填充”或“结构分型”,在结构haul系统中,如果两个对象拥有相同的形态,就认为他们是一个类型。

    1. interface Point {
    2. x: number;
    3. y: number;
    4. }
    5. function logPoint(p: Point) {
    6. console.log(`${p.x}, ${p.y}`)
    7. }
    8. const point = { x: 12, y: 26, z:33};
    9. logPoint(point); // 12 26
    1. 上面例子中,point中有多余的字段,但是仍然是正常的,说明类型约束条件需要是被匹配对象的子集。