前端 TS 基本知识

110 阅读3分钟

开发环境搭建

安装Node.js

Node.js : Node.js (nodejs.org)

安装TS

npm i -g typescript

image.png

测试

编写代码

image.png

代码编译

tsc name

image.png

编译监视

tsc name -w : 自动监视文件修改

image.png

批量监视

ts同级目录下创建tsconfig.json文件,控制台输入tsc -w

image.png

image.png

image.png

tsconfig.json 参数配置

{
  // include 用来指定哪些ts文件需要被配置
  "include": [
    // * 表示任意文件
    // ** 表示任意目录
    "./*"
  ],

  // exclude 用来指定哪些ts不需要被编译
  "exclude": [
    "./03_hi.ts"
  ],

  // compilerOptions 编译器选项
  "compilerOptions": {
      // target 指定ts被编译为js的版本
      "target": "es6",

      // module 指定要是有的模块化标准 
      "module": "system",

      // 用来指定项目中要使用的库
      "lib": ["es6","DOM"],

      // 用来指定编译后文件所在的目录
      "outDir": "./dist",

      // 将代码合并为一个js
      "outFile": "./dist/app.js",

      // 是否对js文件进行编译
      "allowJs": false,

      // 是否对js文件进行语法检查
      "checkJs": false,

      // 是否允许注释
      "removeComments": false,

      // 不生成编译后的文件
      "noEmit": false,

      // 如果有错误时,不生成编译后的文件
      "noEmitOnError": false,

      // 是否开启严格模式
      "alwaysStrict": true,

      // 不允许明确类型的this
      "noImplicitThis": false,

      // 严格的检查空值
      "strictNullChecks": false,

      // 所有严格检查的总开关
      "strict": false
  }
}

类型申明

image.png

联合类型

image.png

any 与 unknown 区别

  1. any 可以赋值给任意

  2. unknown 不可以赋值给其他类型的变量

断言

image.png

never

image.png

限制对象参数

image.png

限制方法参数

image.png

数组

image.png

元组

image.png

枚举

image.png

类型别名

image.png

面向对象

属性定义

// 使用 class 定义类
class Person{
    name:string = "zhangsan";

    // 静态属性,不需要创建对象也可以使用
    static age:number=18

    // 只读属性
    readonly sex = "male"
}

方法定义

// 使用 class 定义类
class Person{
    name:string = "zhangsan";

    // 静态属性,不需要创建对象也可以使用
    static age:number=18

    // 只读属性
    readonly sex = "male"

    // 定义方法
    sayHi(){
        console.log("hi")
    }

    // 静态方法
    static sayHello(){
        console.log("hello")
    }
}

构造方法

class Dog{
    name:string
    age:number

    // 构造函数会在对象创建时调用
    constructor(name:string,age:number){
        this.name = name;
        this.age = age
    }
}

继承

(function(){

    class Animal{

        name:string
        age:number

        constructor(name:string,age:number){
            this.name = name;
            this.age = age
            }

        say(){
            console.log("ooo")
        }
    
    }

    class Dog extends Animal{
        run(){
            console.log(`${this.name} running`)
        }
    }

    class Cat extends Animal{
        say(){
            console.log("mmm")
        }
        }

new Dog("huang",4).run()
new Cat("a1",4).say()


})();

super

(function(){

    class Animal{

        name:string

        constructor(name:string){
            this.name = name;
            }

        say(){
            console.log("ooo")
        }
    
    }

    class Dog extends Animal{

        age:number;

        constructor(name:string,age:number){
            super(name)
            this.age = age
        }

        say(){
            super.say()
        }

    }


console.log(new Dog("huang",4))


})();

抽象类

(function(){

    // 以 abstract 开头的类为抽象类
    // 比普通类相比,不能用来创建对象
    // 抽象类就是专门用来继承的 
    abstract class Animal{

        name:string

        constructor(name:string){
            this.name = name;
            }

        // 定义一个抽象方法
        // 抽象方法使用 abstract 开头,没有方法体
        // 抽象方法只能定义在抽象类中,子类必须必须对抽象方法进行重写
        abstract say():void

    }

    class Dog extends Animal{

        age:number;

        constructor(name:string,age:number){
            super(name)
            this.age = age
        }

        say(){
           console.log("www")
        }

    }

console.log(new Dog("huang",4))

})();

接口

(function(){

    type myType = {
        name:string,
        age:number,
        [propname:string]:any
    }

    const obj : myType = {
        name:"zhangsan",
        age:12
    }

    // 用来定义一个类结构
    interface myInterface{
        name:string,
        age:number
    }

    interface myInterface{
        gender:number
    }

    const obj2 : myInterface = {
        name:"zhangsan",
        age:12,
        gender:1
    }

    interface myInterface2{
        gender:number
        say():void
    }

    class MyClass implements myInterface2{
        name: string;
        gender: number;

        constructor(name:string,gender:number){
            this.gender = gender
            this.name = name
        }

        say(){
            console.log("hi")
        }
    }


})();

属性封装

(function(){

    class MyClass{
        private _name: string;
        private gender: number;

        constructor(name:string,gender:number){
            this.gender = gender
            this._name = name
        }

        say(){
            console.log("hi")
        }

        getName(){
            return this._name
        }

        get name(){
            return this._name
        }
    }

})();

泛型


function f<T>(a:T){
    return a;
}

f(10)
// 手动指定类型
f<string>("hi")

// 可以指定多个范型
function f2<T,K>(a:T,b:K):T{
    console.log(b)
    return a;
}

interface Inter{
    len:number
}

// 泛型T必须实现Inter
function f3<T extends Inter>(a:T):number{
    return a.len
}