首页 > 其他分享 >TypeScript 入门

TypeScript 入门

时间:2024-08-12 23:38:06浏览次数:10  
标签:TypeScript console log number name let id 入门

0x01 概述

  • TypeScript 官网

  • TypeScript 是一种基于 JavaScript 构建的强类型编程语言

    • JavaScript 的超集,即 JavaScript 是 TypeScript 的子集
    • JavaScript 类型化,即在 JavaScript 基础上添加类型系统
  • 优势:

    • 提供可读性和可维护性
    • 在编译阶段检查并报错
  • 环境:

    1. 安装 NodeJS
    2. 使用命令 npm install -g typescript 全局安装 TypeScript
  • 编译与运行:

    1. 方案一:

      1. 创建 index.ts

        let a: number = 123;
        console.log(a);
        
      2. 使用命令 tsc ./index.ts 编译 index.ts 文件,生成同名的 index.js 文件

        var a = 123;
        console.log(a);
        
      3. 使用命令 node ./index.js 运行生成的 index.js 文件

    2. 方案二:

      1. 使用命令 npm install -g ts-node 全局安装 ts-node 工具
        • 用于简化方案一的步骤,直接编译和运行 TypeScript 文件
      2. 使用命令 ts-node ./index.ts 编译和运行 index.ts 文件
        • 或使用 VSCode 的 Code Runner 插件

0x02 类型

(1)基础数据类型

  • number:数字

    let a: number = 123;
    
  • string:字符串

    let a: string = "abc";
    
  • boolean:布尔

    let a: boolean = true;
    
  • null:空值

    let a: null = null;
    
  • undefined:未定义

    let a: undefined = undefined;
    
  • symbol:Symbol

    let a: symbol = Symbol("a");
    
  • void:函数无返回值

  • never:函数返回错误值

(2)复杂数据类型

  • 对象:

    type MyObj = {
      id: number;
      name?: string;
    };
    
    let a: MyObj = { id: 1, name: "a" };
    let b: MyObj = { id: 1 };
    
    • type 是声明类型别名的关键字
  • 数组:

    let a: number[] = [1, 2, 3];
    let b: Array<number> = [1, 2, 3];
    
  • 类:

    class MyClass {}
    
    let a: MyClass = new MyClass();
    
  • 函数:

    let a: () => number = () => 1 + 2;
    
  • 元组:

    let a: [number, string] = [123, "abc"];
    
  • 任意数据类型:anyunknown

(3)类型注解与类型推断

  • 类型注解:在声明变量时,指定变量的数据类型

    let a: number = 123;
    console.log(typeof a);	// number
    
  • 类型推断:在声明变量时,指定变量的值,由 TypeScript 编译器自动推断变量的数据类型

    let a = 123;
    console.log(typeof a);	// number
    

(4)函数类型注解

  • 返回类型注解:

    function a(): number {
      return 123;
    }
    
  • 参数注解:

    function b(num: number): number {
      return num;
    }
    
  • 对象参数注解:

    function c({ a, b }: { a: number; b: number }): number {
      return a + b;
    }
    

(5)类型符号

  • A | B:联合类型,变量为 A 类型或 B 类型
  • A & B:交叉类型,变量为 A 类型且 B 类型(常用于对象类型)

(6)类型断言

  • 尖括号:

    let num: any = 123;
    console.log((<string>num).length);	// undefined
    
  • as 关键字:

    let num: any = 123;
    console.log((num as string).length);	// undefined
    

(7)操作符

  • !:非空断言

    let a: string | null;
    console.log(a!.length);
    
  • ?:可选链操作符

    let a: {
      b?: {
        c?: number;
      };
    } = {};
    console.log(a?.b?.c);	// undefined
    
  • ??:空值合并操作符

    let a: null = null;
    let b = a ?? 10;
    console.log(b);
    
    • || 区别在于:当左值为空值时采用右值,而 || 的左值为假值时采用右值

(8)interface 对象类型

  • 一种校验工具,并指定对象的各个属性

  • 一般语法:

    interface MyObj {
      id: number;
      name: string;
    }
    
    let a: MyObj = { id: 1, name: "a" };
    
  • 可选属性:?

    interface MyObj {
      id: number;
      name?: string;
    }
    
    let a: MyObj = { id: 1 };
    
  • 任意属性:

    interface MyObj {
      id: number;
      [propName: string]: any;
    }
    
    let a: MyObj = { id: 1, name: "a" };
    
  • 只读属性:

    interface MyObj {
      readonly id: number;
      [propName: string]: any;
    }
    
    let a: MyObj = { id: 1, name: "a" };
    a.id = 2;	// 此语句报错:Cannot assign to 'id' beacause it is a read-only property.
    

(9)枚举类型

  • 使用 enum 关键字声明枚举类型

  • 举例一:颜色枚举

    enum Color {
      RED = "#f00",
      GREEN = "#0f0",
      BLUE = "#00f",
    }
    
    console.log(Color.RED);
    console.log(Color.GREEN);
    console.log(Color.BLUE);
    
  • 举例二:数值自增

    enum Letter {
      a,
      b = 2,
      c,
      d,
    }
    
    console.log(Letter.a);  // 0
    console.log(Letter.b);  // 2
    console.log(Letter.c);  // 3
    console.log(Letter.d);  // 4
    

0x03 类

(1)基本使用

  • TypeScript 兼容 ES6 和 ES7 关于类的使用方法

    • ES6 类:

      class MyClass {
        constructor() {
          this.name = "ES6";
        }
        getName() {
          return this.name;
        }
      }
      
    • ES7 类:

      class MyClass {
        name;
        constructor() {
          this.name = "ES7";
        }
        getName() {
          return this.name;
        }
      }
      
  • ES 中,继承父类的子类可以使用 super 关键字调用父类的方法

    class Parent {
      name = "Parent";
      getName() {
        console.log("Parent: ", this.name);
      }
    }
    
    class Child extends Parent {
      name = "Child";
      getName() {
        console.log("Child: ", this.name);	// Child: Child
        super.getName();					// Parent: Child
      }
    }
    
    let child = new Child();
    child.getName();
    
  • TypeScript 的类提供了三种访问修饰符:publicprivateprotected

    • protected 的作用与 private 类似,区别在于可以在继承子类被访问
    class Parent {
      protected name = "Parent";
    }
    
    class Child extends Parent {
      getName() {
        console.log("Child: ", this.name);
      }
    }
    
    let child = new Child();
    child.getName();	// Child: Parent
    

(2)存取器

TypeScript 的类提供了 getter 修饰符 get 和 setter 修饰符 set

class MyClass {
  private a: number;
  constructor(a: number) {
    this.a = a;
  }
  get aValue() {
    return this.a;
  }
  set aValue(a: number) {
    this.a = a;
  }
}

let mc = new MyClass(1);
console.log(mc.aValue);		// 1
mc.aValue = 2;
console.log(mc.aValue);		// 2

(3)抽象类

  • 使用 abstract 关键字定义抽象类

  • 抽象类不可被实例化

  • 举例:

    abstract class Person {
      abstract call(): string;
    }
    
    class Student extends Person {
      call() {
        return "student";
      }
    }
    
    let student = new Student();
    console.log(student.call());
    

0x04 泛型

(1)概述

  • 泛型指根据使用时的数据类型而定,对内类型同一,对外类型不定

  • 泛型有利于方法、类的复用

  • 举例:

    function map<T>(arr: T[], fn: (item: T) => T) {
      return arr.map(fn);
    }
    
    let arr = map([1, 2, 3], (item) => item + 1);
    console.log(arr);	// [ 2, 3, 4 ]
    

(2)泛型函数与泛型接口

  • 泛型函数与非泛型函数:

    // 泛型函数
    let fn1: (arg: any) => any;
    
    // 非泛型函数
    let fn2: <T>(arg: T) => T;
    
  • 相比非泛型函数,泛型函数可以在使用时统一函数中的数据类型,而 any 不具有统一性

  • 泛型接口与泛型函数类似:

    interface I {
      <T>(x: T): T;
    }
    

(4)泛型类

  • 泛型类的定义方法与泛型函数类似

  • 举例:模拟数组

    class MyArray<T> {
      private data: T[];
      private count: number;
      private capacity: number;
    
      constructor(capacity: number) {
        this.data = new Array(capacity);
        this.count = 0;
        this.capacity = capacity;
      }
    
      push(element: T): void {
        if (this.count === this.capacity) {
          this.resize(this.capacity * 2);
        }
        this.data[this.count] = element;
        this.count++;
        return;
      }
    
      pop(): T {
        if (this.count === 0) {
          throw new Error("Empty array");
        }
        const element = this.data[this.count - 1];
        this.count--;
        if (this.count < this.capacity / 4) {
          this.resize(this.capacity / 2);
        }
        return element;
      }
    
      private resize(newCapacity: number): void {
        const newData = new Array(newCapacity);
        for (let i = 0; i < this.count; i++) {
          newData[i] = this.data[i];
        }
        this.data = newData;
        this.capacity = newCapacity;
      }
    }
    
    let arr = new MyArray<number>(10);
    arr.push(1);
    arr.push(2);
    arr.push(3);
    console.log(arr);
    arr.pop();
    console.log(arr);
    

(5)泛型约束

  • 通过接口与 extends 关键字实现约束

  • 用于确保它至少具有某些特定的属性或符合某个特定的接口

  • 举例:

    interface Length {
      length: number;
    }
    
    function fn<T extends Length>(arg: T): T {
      console.log(arg.length);
      return arg;
    }
    

-End-

标签:TypeScript,console,log,number,name,let,id,入门
From: https://www.cnblogs.com/SRIGT/p/18355938

相关文章

  • C ++ 也可以搭建Web?高性能的 C++ Web 开发框架 CPPCMS + MySQL 实现快速入门案例
    什么是CPPCMS?CppCMS是一个高性能的C++Web开发框架,专为构建快速、动态的网页应用而设计,特别适合高并发和低延迟的场景。其设计理念类似于Python的Django或RubyonRails,但针对C++提供了更细粒度的控制和更高效的性能。主要特点和优点1.高性能与并发处理​Cp......
  • Java基础入门18:File、IO 流1(方法递归、字符集、IO流-字节流)
    File和IO流FileFile是java.io.包下的类,File类的对象,用于代表当前操作系统的文件(可以是文件、或文件夹)。IO流用于读写数据的(可以读写文件,或网络中的数据...)File代表文件IO流用来读写数据File创建对象创建File类的对象注意:File对象既可以代表文件、也可以代表文......
  • Java入门基础16:集合框架1(Collection集合体系、List、Set)
    集合体系结构Collection是单列集合的祖宗,它规定的方法(功能)是全部单列集合都会继承的。collection集合体系Collection的常用方法packagecom.itchinajie.d1_collection;importjava.util.ArrayList;importjava.util.HashSet;/**目标:认识Collection体系的特点。*......
  • python入门语法
    python入门语法前言python概述:是一门以面向对象为基础的面向函数式编程语言,强调的解决问题本身,而不是语言的结构等.特点:简单,易学,开源,免费,可移植性,丰富的库.1.变量变量介绍概述:用于临时存储数据的,存储在内存中,程序执行结束,数据就丢失了.......
  • Ubuntu基础入门指南
    简介        Ubuntu是一个基于Debian的Linux发行版,以其易用性和强大的社区支持而闻名。无论你是初学者还是有经验的用户,Ubuntu都能提供丰富的功能和友好的用户体验。本博客将带你了解Ubuntu的基础知识,帮助你快速入门。安装Ubuntu        安装Ubuntu相对简......
  • AWS Lambda 十年回顾:功能总览、更新记录与入门指南
    这次,我为2014年11月发布的AWSLambda创建了一个历史时间表。AWSLambda是一项无服务器、全托管的代码执行服务,今年2024年11月将迎来其宣布发布的十周年纪念。虽然提前了一些,但为了提前庆祝这一重要时刻,我写了这篇文章。文章中,我从AWSLambda的诞生到功能的增加和更新进行了追......
  • BOOST c++库学习 之 boost.thread入门实战指南 使用boost.thread库以及读写锁mutex的
    Boost.Thread库简介1.概述Boost.Thread库是Boost库中专门用于处理多线程编程的模块。它提供了一组跨平台的线程管理和同步工具,帮助开发者在C++中更轻松地编写多线程程序。Boost.Thread的设计目标是使多线程编程更加简单、可靠,同时保持高效和可移植性。2.Boost.Thread......
  • 三十分钟入门基础Go(Java小子版)
    前言Go语言定义Go(又称Golang)是Google的RobertGriesemer,RobPike及KenThompson开发的一种静态、强类型、编译型语言。Go语言语法与C相近,但功能上有:内存安全,GC,结构形态及CSP-style并发计算。适用范围本篇文章适用于学习过其他面向对象语言(Java、Php),但没有学过......
  • AI绘画实操 Stable Diffusion 到底怎么玩儿,新手必看的AI绘画入门安装使用教程
    大家好,我是灵魂画师向阳2024年,是AI绘画技术飞速发展的一年,各种AI绘画工具层出不穷,为了让大家在了解和学习AI绘画的过程中少走弯路,今天我将详细介绍目前世界上使用用户最多,社区最大,生态最丰富的免费图像生成模型——StableDiffusion,并为你提供详细的安装教程,让你轻松踏入AI......
  • Java入门学习——Day04 运算符
            在Java编程中,运算符是基本的构建块,用于执行各种操作,如算术、比较和逻辑操作。了解运算符的使用对于编写正确的代码非常重要。目录一、算数运算符1.加法2.减法3.乘法4.除法二、赋值运算符1.赋值2.加赋值3.减赋值4.乘赋值5.除赋值6.取余赋值三、......