TS基础语法

176 阅读5分钟

安装TypeScipt

npm install typescipt -g //全局安装

TS配置编译项

//生成tsconfig.json配置文件
tsc -init
//自动编译
tsc -watch
{
 /*
  tsconfig.json是ts编译器的配置文件 ts编译器可以根据它的信息来对代码进行编译
  “include” 用来指定哪些ts文件需要被编译
  路径:** 表示任意目录
       *  表示任意文件
  “exclude” 不需要被编译的文件目录
  默认值:["node_moules,","bower_components","jspm_packages"]
 */
  "include": [
    "./src/**/*"
  ],
  /*
    compilerOptions 编译器的选项
  */
  "compilerOptions": {
    // target 用来指定ts被编译为的es版本
    "target": "ES2015",
    //module 指定要使用的模块化规范
    //'commonjs', 'amd', 'system', 'umd', 'es6', 'es2015', 'es2020', 'es2022', 'esnext', 'node16', 'nodenext'.
    "module": "ES2015",
    //lib 用来指定项目中要使用的库
//    "lib": ["dom"]
    //outDir 用来指定编译后的文件所在的目录
    "outDir": "./dist",

    //将代码合并成一个文件
    //设置outfile后 所有的全局作用域中的代码会合并到一个文件中
//    "outFile": "./dist/app.js",
    //是否对js编译 默认false
    "allowJs": false,
    //是否检查js代码语法是否合规 默认false
    "checkJs": false,
    //是否移除注释
    "removeComments": false,
    //不生成编译后的文件
    "noEmit": true,
    //当有错误的时候不生成编译后的文件
    "noEmitOnError": true,
    //严格检查的总开关
    "strict": false,
    // 用来设置编译后的文件是否使用严格模式
    "alwaysStrict": true,
    //不允许隐式any
    "noImplicitAny": true,
    //不允许不明确类型不明确的this
    "noImplicitThis": false,
    //检查空值
    "strictNullChecks": false,
  }
}

TS常用的类型

基元类型:string number Boolean

let str: string = 'hello'
let number : number = 100
let  bool: boolean = false
// 可以直接使用字面量进行类型声明
let a :10
a=10
//a=11

//可以使用 | 来连接多个类型(联合类型)
let b:number | boolean
// b=10
b=true

any 表示的任意类型(不建议使用)

设置类型为any后相当于对该变量关闭了ts的类型检查

let d:any
// 声明变量如果不指定类型 则ts解析器会自动判断变量的类型为any (隐式的any)
let d;
d=10
d='hello'

unknown

//unknown 表示类型未知的值
let e:unknown
e=10
e='hello'
// unknown实际上就是一个类型安全的any
// unknown 类型的变量不能直接赋值给其他变量
if (typeof e === 'string'){
    d = e
}

类型断言

//类型断言 可以用来告诉解析器变量的实际类型
/*
* 语法:
*   变量 as 类型
*   <类型>变量
* */
d = e as  string
d = <string> e

void

//void 用来表空 以函数为例 就表示没有返回的函数
function fn(num):void{

}

never

//never 表示没有返回值
function fn2():never{
    throw new Error('报错')
}

抽象类

  • 以abstract开头的类是抽象类
  • 抽象类和其他类区别不大 只是不能用来创建对象
  • 抽象类中可以添加抽象方法
(function (){
    /*
    * 以abstract开头的类数抽象类
    *       抽象类和其他类区别不大 只是不能用来创建对象
    *       抽象类中可以添加抽象方法
* * */
    abstract class Animal{
        name:string
        constructor(name:string){
            this.name = name
        }
        /*
        * 定义一个抽象方法
        * 抽象方法使用abstract开头没有方法体
        * 抽象方法只能定义在抽象类中 子类必须对抽象方法进行实现
        * */
       abstract bark():void
    }
    class Dog extends Animal{
        bark() {
           console.log('222')
        }
    }
    class Cat extends Animal{
        bark() {
            console.log('mmm')
        }
    }
    const dog = new Dog('w')
    dog.bark()
})()

接口

  • 接口用来定义一个类结构 用来定义一个类中应该包含哪些属性和方法
  • 同时接口也可以当成类型去声明
(function (){
    // type myType={
    //     name:string,
    //     age:number,
    // }
    /*
    * 接口用来定义一个类结构 用来定义一个类中应该包含哪些属性和方法
    * 同时接口也可以当成类型声明去使用
    * */
    interface myinterface {
        name:string,
        age:number
    }
    interface myinterface {
        gender:string
    }
    // const obj:myinterface={
    //     name:'1',
    //     age:2,
    //     gender:'男'
    // }
    /*
    * 接口可以在定义类的时候去限制类的解构
    * 接口中的所有属性都不能有实际的值
    * 接口指定义接口而不考虑实际值
    *   在接口中所有方法都是抽象方法
    * */
    interface myinter{
        name:string,
        sayhello():void
    }

    /*
    *   定义类时 可以使用类实现一个接口
    *   实现接口就是使类满足接口的要求
    * */
    class Myclass implements myinter{
        name:string
        constructor(name:string) {
            this.name = name
        }
        sayhello(){
            console.log('hello')
        }
    }
})()

泛型

  • 在定义类或函数时遇到不确定的类型可以使用泛型
  • 语法:函数名/类名<泛型名>(参数:泛型名)
 function fn<T>(val:T):T{
     return val
 }
 //可以直接调用具有泛型的函数
 let res =fn(10) //不指定泛型ts可以自动进行类型推断
 let res2 =fn<string>('hello') //指定泛型
  • 泛型可以直接定义多个
 function fn2<T,K>(a:T,b:K){
     console.log(b)
     return a
 }
 fn2<string,number>('a',2)
 interface inter{
     length:number
 }
 //T extends Inter 表示泛型T必须是inter实现类(子类)
 function fn3<T extends inter>(a:T){
     return a.length
 }
console.log( fn3({length:1}))

webpack打包ts代码

const path = require('path')
// 引入html插件
const HTMLWebpackPlugin = require('html-webpack-plugin')
//webpack中的所有配置信息都应该写在module.exports中
//引入clean插件
const {CleanWebpackPlugin} = require('clean-webpack-plugin')
module.exports={
    mode: "none",
    //指定入口文件
    entry:"./src/index.ts",
    //指定打包文件所在的目录
    output:{
        //指定打包文件的目录
        path:path.resolve(__dirname,'dist'),
        //打包后文件的文件
        filename:"bundle.js",
        //告诉webpack不使用箭头函数
        environment: {
            arrowFunction: false
        }
    },
    //指定webpack打包时要使用的模块
    module:{
        //指定要加载的规则
        rules:[
            {
                //test指定的是规则生效的文件
                test:/.ts$/,
                //要使用的loader
                use:[
                    //配置babel
                    {
                      //指定加载器
                        loader: "babel-loader",
                        //设置babel
                        options: {
                            //设置预定义的环境
                            presets:[
                                [
                                    //指定环境的插件
                                    "@babel/preset-env",
                                    //配置信息
                                    {
                                        // 要兼容的目标浏览器
                                        targets:{
                                            "chrome":"88"
                                        },
                                       //  指定corejs的版本
                                       "corejs":"3",
                                        // 使用corejs的方式 useage 表示按需加载
                                        "useBuiltIns":"usage"
                                    },

                                ]
                            ]
                        }
                    },
                    'ts-loader'
                ],
                //要排除的文件
                exclude:/node-modules/
            }
        ]
    },
//     配置webpack插件
    plugins:[
        new CleanWebpackPlugin(),
        new HTMLWebpackPlugin(),
    ],
    resolve: {
        extensions: ['.ts','.js']
    }
}