typeScript学习笔记

一、什么是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) {}
}

三、工程

四、实战

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容