美文网首页
typeScript学习笔记

typeScript学习笔记

作者: 摸爬打滚 | 来源:发表于2019-07-26 18:38 被阅读0次

    一、什么是typeScript

    拥有类型系统的JavaScript的超级,可以编辑成纯JavaScript,像是一个工具

    类型检查:会在编译代码时进行严格的静态类型检查,编码是发现存在的隐患
    
    语言扩展:会包括es6和未来提案中的特性,接口抽象类型
    
    工具属性:可以编译成标准的JavaScript,可以在任何浏览器操作系统上运行
    

    好处:提高开发效率,降低维护成本,重塑类型思维

    二、基础

    1、不同类型的语言

    (1)强类型语言与弱类型语言
    • 强类型语言:不允许改变变量的属于类型,除非进行强制的类
    • 型转换
      弱类型语言:变量可以被赋予不同的数据类型
    (2)动态类型语言与静态类型语言
    • 动态类型语言:在执行阶段确定所有的变量类型。在程序运行时,动态计算属性偏移量;对类型非常宽松;bug可能隐藏;运行性能差;可读性差。但是:性能可以改善,单元测试可以测试出隐藏bug
    • 静态类型语言:在编译阶段确定所有的变量类型。编译阶段确定属性偏移量;对类型季度严格;运行性能好

    2、编写一个typeScript程序

    步骤:
        1、全局安装typeScript:  
            npm i typescript -g 
        2、获取帮助信息:  
            tsc -h
        3、创建tsc配置项:  
            tsc --init
        4、创建ts文件index.ts,写入:  
            let hello : string = 'Hello TypeScript'
        5、编译ts文件:   
            tsc ./src/index.ts
        6、编译ts文件后生成js文件,其内容: 
            var hello = 'Hello TypeScript';
        7、为了让工程项目跑起来,需要安装三个包: 
            npm i webpack webpack-cli webpack-dev-server -D 
        8、创建文件夹build,存放配置文件(需要区分开发环境和生成环境的配置,可以分开书写配置)
        
            //根据需要安装'ts-loader'、'typescript'、'html-webpack-plugin'
            //html-webpack-plugin可以将ts的内容映射到index文件中,因此要创建一个index.html文件。并在body标签下加入<div class="app"></div>
            //webpack.base.config.js:
            const HtmlWebpackPlugin = require('html-webpack-plugin')
            module.exports = {
                entry: './src/index.ts',
                output: {
                    filename: 'app.js'
                },
                resolve: {
                    extensions: ['.js', '.ts', '.tsx']
                },
                module: {
                    rules: [
                        {
                            test: /\.tsx?$/i,
                            use: [{
                                loader: 'ts-loader'
                            }],
                            exclude: /node_modules/
                        }
                    ]
                },
                plugins: [
                    new HtmlWebpackPlugin({
                        template: './src/tpl/index.html'
                    })
                ]
            }
            
            
            //webpack.dev.config.js  开发环境
            //启用source-map,以下官方推荐,cheap忽略劣质信息,
            module.exports = {重编译速度快
                devtool: 'cheap-module-eval-source-map'
            }
            
            
            
            //webpack.pro.config.js   生产环境
            //安装'clean-webpack-plugin',作用:每次成功构建之后,帮我们清空很多无用文件
            const { CleanWebpackPlugin } = require('clean-webpack-plugin')
            module.exports = {
                plugins: [
                    new CleanWebpackPlugin()
                ]
            }
            
            
            //webpack.config.js  将基础配置和不同环境所需要的配置结合在一起
            //安装webpack-merge',作用:将基础配置和需要的配置合并
            const merge = require('webpack-merge')
            const baseConfig = require('./webpack.base.config')
            const devConfig = require('./webpack.dev.config')
            const proConfig = require('./webpack.pro.config')
            let config = process.NODE_ENV === 'development' ? devConfig : proConfig
            module.exports = merge(baseConfig, config)
        9、修改npm的脚本,package.json
            //webpack-dev-server 启动项目
            //mode 将当前的环境变量指定为什么
            //config 指定当前环境的配置文件
            "scripts": {
                //开发环境脚本
                "start": "webpack-dev-server --mode=development --config ./build/wbpack.config.js",
                "build": "webpack --mode=production --config ./build/webpack.pro.config.js"
            },
        10、启动项目:
            npm start
        11、打开浏览器查看项目:
            http://localhost:8080/
        
    

    3、基本类型

    (1)类型注解:
    作用:相当于强类型语言中的类型声明,可以对变量起到约束作用
    
    语法:(变量/函数): type
    
    (2)不同的类型
    //原始类型
    let bool: boolean = true
    let num: number = 123
    let str: string = 'abc'
    str = 123 ❌    //不能将类型“123”分配给类型“string”
    
    //数组
    //以下两种数组都是number类型的数组
    let arr1: number[] = [1,2,3]
    let arr2: Array<number> = [1,2,3]
    //想要number和string类型的数组
    let arr3: Array<number | string> = [1,2,3,'4']
    
    //元组,(特殊的数组,限定的数组元素的类型和个数)
    let tuple: [number, string] = [0,'1']
    let tuple1: [number, string] = [0, '1', 9] ❌ //不能将类型“[number, string,number]”分配给类型“[number, string]”。属性“length”的类型不兼容。不能将类型“3”分配给类型“2” 
    //ts允许往元组添加新元素,但是不能访问
    tuple.push(2); console.log(tuple)  // [0, "1", 2]
    tuple[2] ❌  // Tuple type '[number, string]' of length '2' has no element at index '2'
    
    //函数
    let add = (x, y) => x + y  //参数“x”,“y”隐式具有“any”类型。
    let addNumber = (x: number, y: number): number => x + y  //括号后添加的类型为函数返回值的类型,通常返回值类型可以省略,ts会推断
    //定义函数类型并且实现
    let compute: (x: numbwe, y: number) => number; compute = (a, b) => a + b
    
    //对象
    let obj: objsct = {x: 1, y:2}
    obj.x = 3 ❌     //简单指定了obj的类型是object,并没有具体定义应该包含的属性;⚠️any类型,类型“object”上不存在属性“x”
    let obj2: {x: number, y: number} = {x: 1, y: 2}
    obj.x = 3 ✔️
    
    //symbol 具有唯一的值
    let s1: symbol = Symbol()
    let s2 = Symbol()
    console.log(s1 === s2)  //false
    
    //undefined, null
    //被赋值成undefined,null的变量只能被赋值成undefined,null,不能被赋值成其他类型
    let un:undefined = undefined  
    let nu: null = null
    //在ts的官方文档中,undefined,null是任何类型的子类型,是可以被赋值给其他类型,但需要设置!!!
    num = undefined  ❌  //不能将类型“undefined”分配给类型“number”
     "strictNullChecks": false, //打开tsconfig.json
    num = undefined  ✔️
    //以上的方法尽量不要操作,但是必须要赋值,我们可以用联合类型
    let num2: number | undefined | null = 2
    num2 = null
    
    //void 表示没有任何返回值的类型
    let noReturn = () => {}
    
    //any  和js没有什么区别,不是特别情况,不建议使用
    let x
    x = 1
    x = []
    x = () => {}
    
    //never 永远不会有返回类型
    let error = () => {
        throe new Error('error')
    }
    let endless = () => {  //死循环
        while(true) {}
    }
    

    三、工程

    四、实战

    相关文章

      网友评论

          本文标题:typeScript学习笔记

          本文链接:https://www.haomeiwen.com/subject/ntadrctx.html