TS

  • TypeScript 由微软研发,以JavaScript为基础构建的语言,它是js的一个超集,可以在任何支持js的平台中执行,但它不能被js解析器直接执行,需要经过编译成js执行,ts扩展了js
  • ts添加了类型
  • ts 支持ES的新特性
  • 添加ES不具备的新特性
  • 丰富的配置选项,可以支持特定版本的es
开发环境
  • 使用tsc ***.ts命令可以将ts文件编译成js

  • 定义变量格式:let 变量名: 类型 = 初始值;

  • 类型名首字母小写:string, number, boolean

    类型

  • 函数定义格式

function 函数名(参数名:参数类型, 参数名:参数类型): 返回值类型 {

}
  • 如果变量的声明和赋值同时进行,ts会自动对变量进行类型检测
  • 可以直接使用字面量进行类型声明let 变量名: 字面量值, 比如:let a: 10,就是指定a的值只能是10, 如果给a赋值别的值,会报错,比如 a=11;就会报错. 这种常用于使用 | 连接多个值给字面量赋值,比如 let b: "male" | "female";这样定义后 b的值只能是"male" 或者 "female"而不能是其他值
  • 使用 | 连接多个类型称为联合类型, 比如 let c: boolean | string; 定义了一个变量c ,这个c 只能赋值boolean或string类型的值
  • any 表示是任意类型,相当于关闭了TS的类型检测, 声明一个变量,不指定类型,没有赋初始值的时候,默认就是any类型
  • unknown 表示类型安全的any, 它于any的区别在于any类型的变量可以赋值给任何类型的变量, 而unknow类型的变量不能赋值给其他类型的变量,
let s:string="a";
let u:unknown;
u = "str";
s = u; // 报错,不能将unknown类型的变量赋值给string类型的变量
// 可以通过下面的方式赋值
if(typeof u==="string"){ 
  s = u;
}
// 也可以通过下面类型断言的方式赋值
s = u as string;
s = <string>u;
  • 类型断言有两种方式:
    • 一种是: 变量 = unknown类型变量 as 变量的类型;, 比如 s = u as string;
    • 一种是: 变量 = <变量类型>unknown类型变量;,比如 s = <string>u;
  • never: 表示永远不会返回结果
  • 属性名后面加?表示该属性是可选属性, 有也可以没有也可以,如下:
    let b:{name: string, age?: number}
    b = {name:'孙悟空'}; //可以
    b = {name:'孙悟空', age:18}; //可以
    b = {name:'孙悟空', age:18, gender:'male'}; //不可以
  • 任意类型属性: 对象中使用[: string]: any, 表示任意类型的属性都可以,可以随便写, string指的是属性的key使用string类型, any表示属性可以是任意类型,比如
    let c: {name: string, [propsName: string]:any}
    c = {name:"孙悟空", age:18, gender:"female"};//可以
    c = {age=18,gender="female"};// 不可以,其他属性随意,但必须要有name属性
  • 数组的两种表达方式:
    • 一种是: 类型[], 比如:let e: string[] = ['a','b','c'];
    • 一种是: Array<类型>, 比如: let g: Array<number> = [1,2,3];
  • 元祖, 就是固定长度的数组
    let h: [string, string];
    h = ["hello","world"];//可以
    h = ["hello","world","!"];//不可以, 长度不对
    h = ["hello"];//不可以, 长度不对
    h = ["hello",123];//不可以, 元素类型不对
  • 枚举
  • & 用法, 表示同时满足
    let j: {name:string} & {age:number};
    j = {name:""孙悟空} & {age:18}; // 可以
    j = {name:""孙悟空} ; // 不可以,没有满足{age:number}
    j = {age:18} ; // 不可以,没有满足{name:string}

tsconfig.json 配置

  • 使用 type 定义类型别名 type myType = string, myType就相当于string, 通常给联合类型设置别名type myType = 1 | 2 | 3 | 4 | 5;
  • tsc ***.ts -w ,加上-w后会自动监视文件的变化,不用每次都执行tsc ***.ts进行编译产生js文件, 这种方式也很麻烦,如果我们有100个ts文件在改动,那么需要执行一百次这个命令去监视一百个文件的改动
  • 在根目录执行tsc 命令会一次性编译所有的ts文件
  • 我们可以通过在根目录配置tsconfig.json文件的方式,来配置需要编译的文件信息,tsconfig.json 是ts编译器的配置文件,ts编译器可以根据它里面的配置信息来对代码进行编译
  • ts 编译器不会将导入的但没用到的变量编译成js的
include
  • include 用来指定哪些ts文件需要被编译,如果为空,表示所有ts文件需要编译
"include" : [
  "./src/**/*"    //这里两个*表示任意目录,一个*表示任意文件
]
exclude
  • exclude用来指定哪些ts文件不需要编译
"exclude" : [
  "./src/hello/**/*"    //这里表示src/hello目录下的所有ts文件都不需要编译
]
extends
  • extends 定义被继承的配置文件, 比如别的地方已经有一个***.json文件里配置的需要编译的文件信息,那么就可以使用extends将别的文件里的配置信息继承过来, 比如
"extends": "./configs/base"
files
  • files 指定被编译文件的列表,只有需要编译的文件少时才会用到,比如
"files":[
  "core.ts",
  "sys.ts",
  "types.ts",
  ...
]
compilerOptions
  • target: 用来指定编译为ES的版本 "target": "es3" // 指定编译为ES3 版本, target 值不能是随意的,只能是指定的 'es3','es5','es6','es2015','es2016','es2017','es2018','es2019','es2020','esnext',如果不是,编译后会提示
  • module: 指定要使用的模块化的规范, "module":"es2015"
  • lib: 用来指定项目中要使用的库,默认["es6","dom"]一般不需要改
  • outDir: 用来指定编译后文件所在目录, "outDir":"./dist"
  • outFile: 可以将我们所有的全局作用域的代码合并为一个文件,"outFile":"./dist/app.js"
  • allowJs: 是否对js文件进行编译,默认是false, "allowJs":false
  • checkJs: 是否检查js代码是否符合语法规范,默认是false,"checkJs":false
  • removeComments: 是否移除注释
  • noEmit: 不成编译后的文件,true 表示不生成,false 表示生成
  • noEmitOnError: 有错误时不生成编译后的文件,true表示不生成,false表示生成
  • alwaysStrict: 用来设置编译后的文件是否使用严格模式,默认false
  • noImplicitAny: 不允许隐式的any类型,默认false
  • noImplicitThis: 不允许不明确类型的this,默认false
  • strictNullChecks: 严格的检查空值
  • strict: 所有严格检查的总开关

webpack 打包ts代码
  • 使用 npm init -y 命令在根目录下生成package.json文件
  • 使用 npm i -D webpack webpack-cli typescript ts-loader 命令安装webpack和依赖的包, i 表示安装, -D表示开发依赖, webpack-cli是webpack的命令行工具 , typescript 是ts的核心包,ts-loader是webpack的加载器,通过ts-loader可以把我们的ts代码和webpack进行整合
  • 新建webpack.config.js
const path = require('path') // 引入path包
const HTMLWebpackPlugin = require('html-webpack-plugin'); //引入html 插件
const CleanWebpackPlugin = require('clean-webpack-plugin'); //引入插件
// webpack 中的所有配置信息都应该写在module.exports中
module.exports = {
  // 指定入口文件
  entry: "./src/index.ts",
  //指定打包文件所在目录
  output:{
    // 指定打包文件的目录
    path: path.resolve(__dirname,'dist'),
    // 打包后的文件
    filename:"bundle.js"
  },
  // 指定webpack打包时要使用模块
  module:{
    //指定要加载的规则
    rules:[
      {
        // 指定规则生效的文件
        test:/\.ts$/,
        // 要使用的loader
        use:'ts-loader',
        // 要排除的文件
        exclude:/node-modules/
      }
    ]
  }
  plugins:[
    new HTMLWebpackPlugin(
      options:{
        title:"自定义title"
      }
    ),
    new CleanWebpackPlugin(),
  ],
  // 用来设置引用模块
  resolve: {
    extensions: [ '.ts', '.js'], // 凡是以ts,js 结尾的文件都可以作模块使用
  }
}
  • 创建tsconfig.json指定ts的编译规范

  • 在package.json文件的scripts中,加入"build":"webpack"

  • 执行npm i -D html-webpack-plugin 这个插件自动帮我生成html文件,并引入相关资源,

  • 执行npm i -D webpack-dev-server,安装webpack的开发服务器,它可以根据项目的改变自动刷新, 安装完成后需要在package.json文件的scripts中,加入"start":"webpack server --open chrome.exe"

  • 执行npm i -D clean-webpack-plugin ,它可以帮我们在每次编译前将dist文件清空, 然后将编译的最新的文件放进去,这样可以保持dist下的文件避免有旧文件的情况

  • bable 可以将我们新版本的es转换成低版本的,将浏览器不支持的高版本的新特性转换成浏览器兼容的低版本实现


  • 通过static 关键字可以定义类属性(静态属性),通过类访问
  • readonly 修饰的属性是只读属性
  • 方法不需要使用function 修饰,直接方法名+()+{} 就可以了, 如果是static修饰的是类方法
  • public 修饰的属性可以在任意位置访问, 属性默认是public的
  • private 修饰的属性只能在类内访问, 类外访问会报错,子类也不行, 但如果不修改也可以被访问到,因为ts转换成js的时候会转换成可以访问的
  • protected 修饰的属性只能在该类和子类中访问,其他地方不能访问
  • 可以通过 用get 修饰来实现get 方法,比如:
class Person {
  constructor(name:string) {
    this._name = name;
  }
  private _name:stirng;
  get name() { // 注意这里没有下划线, 调用的时候可以直接Person对象.name
    return this._name;
  }
  set name(value: string) {
    this._name = name;
  }
}
const p = Person()
console.log(p.name); //通过.name调用get方法访问
p.name = "***"; //通过.name调用set方法赋值
  • 属性的方便写法
class C{
  // 直接将属性定义在构造函数中
  constructor(public name:string, public age:number){}
}

// 等同于
class C{
  public name:string;
  public age:number;
  constructor(name:string, age:number){
    this.name= name;
    this.age = age;
  }
}
抽象类
  • 用abstract 修饰的类是抽象类,不能用来创建对象,是专门用来被继承的,抽象类中可以添加抽象方法
  • 抽象类中使用abstract 修饰的方法,称为抽象方法,抽象方法没有具体的实现,需要继承的子类自己实现,抽象方法只能定义在抽象类中,并且子类必须对抽象方法进行重写
接口
  • 接口用来定义类的结构,用来定义一个类中应该包含哪些属性和方法,可以当成类型声明去使用
  • 可以定义多个重名的接口, ts会把重名的接口进行合并
  • 接口可以在定义类的时候去限制类的结构
  • 接口中的所有属性都不能有实际值,也不能有方法的实现, 接口只是定义类的结构
  • 接口是让类去实现的, 实现接口就是使类满足接口的要求, 类实现接口使用关键字 implements; class MyClass implements myInterface { }
  • 接口与抽象类的区别是, 抽象类中可以有普通方法也可以有抽象方法, 而接口中只能有抽象方法, 抽象类是被继承的,接口是被实现的
泛型
  • 定义函数或是类时,如果遇到类型不明确的就可以使用泛型
  • 泛型可以同时指定多个
function fn2<T,K>(a:T, b:K): T{
  return a;
}
  • 也可以限制泛型的类型,使用extends限定泛型T必须是Inter的实现类或子类, 这里Inter可以是接口也可以是抽象类,或普通类
interface Inter{
  length: number;
}

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

推荐阅读更多精彩内容

  • TypeScript是微软开发的,基于类的面向对象编程,其文件以 .ts 为后缀名; TypeScript是Jav...
    hellomyshadow阅读 955评论 0 0
  • 一、ts的静态检查 参考为什么要使用TypeScript?有哪些情景请简单介绍一下,或者来个例子?[https:/...
    合肥黑阅读 65,977评论 10 25
  • 与JS类似部分,本文不做说明(运算符、条件语句、循环语句、函数、基本类型等) 前言 TypeScript的设计目的...
    前端菜篮子阅读 404评论 0 2
  • TS 和 JS 的区别是什么?有什么优势?语法层面:TypeScript = JavaScript + Type(...
    云顶天宫写代码阅读 3,609评论 0 1
  • TS特有de概念 元组 指定数组每个元素的类型 特点 在初始化时,必须按限定的类型和个数赋值; 可以通过数组的方法...
    说叁两事阅读 438评论 0 0