美文网首页
typescript 入门

typescript 入门

作者: shadow123 | 来源:发表于2022-04-14 17:57 被阅读0次

ts 是js 的超集

安装

npm install typescript -g

运行

tsc index.ts

node.js 环境执行ts

npm i @types/node --save-dev (node环境支持的依赖必装)
npm i ts-node --g

类型

基础类型:Boolean、Number、String、null、undefined、Symbol、BigInt

字符串类型

let a:stirng = "123"

let str:string = `${a}456`

数字类型

let notNumer: number = NaN
let num: number = 123
let infinityNum:number = Infinity
let hex: number = 0Xf003 // 十六进制
let binary: number = 0b10101 // 二进制
let octal:number = 0o765 // 八进制

布尔类型

let bool1: boolean = true
let bool2: boolean = false

注意使用 new Boolean 返回的是Boolean 对象

let boolObj:boolean = new Boolean()
// 报错:不能将类型“Boolean”分配给类型“boolean”。
//  “boolean”是基元,但“Boolean”是包装器对象
// 改成Boolean 就没问题了
let boolObj:Boolean = new Boolean()

空值类型

let u: void = undefined
let n: void = null
// 在 TypeScript 中,可以用 void 表示没有任何返回值的函数
function Fn(): void{
    console.log("test-void")
}

Null 和 Undefined 类型

let u1: undefined = undefined
let n1:null = null

void、null、undefined 区别

与 void 的区别,undefined 和 null 是所有类型的子类型。也就是说undefined 类型的变量,可以给string类型的变量赋值

let test: void = undefined
let str1: string = "123"
str1 = test // 报错:不能将类型“void”分配给类型“string”

let test1: undefined = undefined
let str2: string = "123"
str2 = test1

let test2: null = null
let str3: string = "123"
str3 = test2

注意:
如果在tsconfig.json 开启了严格模式

{
  "compilerOptions": {
    "strict": true
  }
}
let test3: null = null
let str4: void = undefined
str4 = test3 // 报错:不能将类型“null”分配给类型“void”

any类型

let a: any = "12313"
a = 1231
a = false

let b; // 默认any类型
b = 123
b = "hello"

unknow 类型

TypeScript 3.0中引入的 unknown 类型也被认为是 top type ,但它更安全。与 any 一样,所有类型都可以分配给unknown

let val: unknown;

val = "hello"
val = 123
val = true
val = [1, 2, 3]
val = { a: 1, b: 2 }
val = null
val = undefined
val = Symbol("id")

any 和 unknown 区别

// 如果是any类型在对象没有这个属性的时候获取是不会报错的
let obj: any = { a: 1 }
obj.b

// 如果是unknow 是不能调用属性和方法
let obj: unknown = { a: 1, c:():number => 33}
obj.a
obj.c()

对象的类型

在typescript中,我们定义对象的方式要用关键字interface(接口)。

interface Person{
    name: string,
    age:number
}

let person: Person = {
    name:"张三"
} // 类型 "{ name: string; }" 中缺少属性 "age",但类型 "Person" 中需要该属性。

// 加上age 属性就没问题了
let person: Person = {
    name: "张三",
    age:18  
}
//重名interface  可以合并
interface A{
    name:string
}

interface A{
    age:number
}

let a: A = {
    name: "zhangsan",
    age:18
}
// 继承
interface B extends A{
    sex: string
}

let b: B = {
    name: "lisi",
    age: 22,
    sex:"男"
}

可选属性

可选属性的含义是该属性可以不存在

interface Person{
    name: string,
    age?:number
}

let person: Person = {
    name: "张三"
}

任意属性[propName:string]

需要注意的是,一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集:

interface Person{
    name: string,
    age?: number,
    [propName:string]:any
}

let person: Person = {
    name: "张三",
    sex:"男"
}

只读属性 readonly

interface Person{
    name: string,
    readonly age?: number,
    [propName:string]:any
}

let person: Person = {
    name: "张三",
    age:18,
    sex:"男"
}

person.age = 20 // 无法分配到 "age" ,因为它是只读属性

添加函数

interface Person{
    name: string,
    readonly age?: number,
    [propName: string]: any,
    fn():void
}

let person: Person = {
    name: "张三",
    age:18,
    sex: "男",
    fn(){
        console.log(this.name)
    }
}

数组类型

1.类型 []

let arr: number[] = [1, 2, 3]
let arr1: number[] = [1, 2, '3'] // 报错:不能将类型“string”分配给类型“number”。

// 操作方法也不行
arr.push("3") // 报错:类型“string”的参数不能赋给类型“number”的参数。

let arr2: string[] = ['1', '2', '3']
let arr3:any = [1,2,'3',{a:1},true,[1,2]]

2.泛型

let arr: Array<number> = [1, 2, 3]
let arr1: Array<string> = ['1', '2', '3']
let arr2:Array<any> =  [1,2,'3',{a:1},true,[1,2]]

3.接口

interface numberArr{
    [index:number]:number
}

let arr: numberArr = [1, 2, 3]
// 多维数组
let arrNum: numberArr[] = [[1,2,3], [2,3,4], [3,4,5]]
let arrNum2: numberArr[][] = [[[1,2,3]], [[2,3,4]], [[3,4,5]]]


interface Person{
    name: string,
    age:number
}

let list: Person[] = [{
    name: "张三",
    age:18
}, {
    name: "李四",
    age:20
}]

4.arguments类数组


function arrFn(...args: any): void{
    console.log(arguments)
    let arr:IArguments = arguments
    console.log("arr",arr,arr.length,arr.callee)
}


arrFn(1, 2, 3, 4, 5)


//其中 IArguments 是 TypeScript 中定义好了的类型,它实际上就是:
interface IArguments1{
    [index: number]: number;
    length: number;
    callee: Function;
}

函数类型

const fn = (name: string): string => {
    return name
}

fn("123")

// 可选类型
const fn = (firstName: string,lastName?:string): string => {
    return firstName + lastName
}

fn("firstname")

// 默认参数
const fn = (firstName: string = "firstname",lastName?:string): string =>{
    return firstName + lastName
}
fn() // firstnameundefined

// 接口定义函数
interface Add{
    (num:number,num2:number):number
}

const fn: Add = (num: number, num2: number): number => {
    return num + num2
}

fn(1,2)

interface User{
    name: string,
    age:number
}

function getUser(user: User):User{
    return user
}

// 定义剩余参数
const fn1 = (array: number[], ...items: any[]): any[] => {
    console.log(array,items)
    return items
}

fn1([1,2,3],'4','5','6')

函数重载

重载是方法名字相同,而参数不同,返回类型可以相同也可以不同。

如果参数类型不同,则参数类型应设置为 any。

参数数量不同你可以将不同的参数设置为可选。

function fn(params: number): void
function fn(params: string, params2: number): void
function fn(params: any, params2?: any): void{
    console.log(params)
    console.log(params2)
}

fn(123)
fn('123',345)

联合类型

let phone: string | number = "010-888"
phone = 13521330001

// 函数联合类型
const fn = (num: number | boolean): boolean => {
    return !!num
}

交叉类型

多种类型的集合,联合对象将具有联合类型的所有成员

interface Person{
    name: string,
    age:number
}

interface Man{
    sex:string
}

const person = (person: Man & Person) => {
    console.log(person)
}

person({
    name: "张三",
    age: 18,
    sex:"男"
})

类型断言

语法:
1.值 as 类型 (value as string)
2.<类型>值 (<string>value)

interface A{
    name:string
}

interface B{
    name1: string
}
// 值 as 类型 
const fn = (type: A | B): string => {
    return (type as A).name
}
// <类型>值 
const fn = (type: A | B): string => {
    return (<A>type).name
}

注意:类型断言只能够欺骗TypeScript 编译器,无法避免运行时错误。

使用any 临时断言

window.abc = 123 // 报错:window 上没有 abc 属性

// 使用 any 临时断言,访问任何属性都是允许的
(window as any).abc = 123

as content

const name1 = "张三"

name1 = "李四"  // 无法修改

let name2 = "张三" as const

name2 = "李四"  // 无法修改


let a1 = [1, 2, 3] as const

a1.push(4) // 报错:此时已经断言字面量为[1,2,3],数据无法做任何修改

const a2 = [1, 2, 3]
a2.push(4)  // 通过,没有修改指针

注意:类型断言是不具影响力的,不会影响结果,编译过程中会删除类型断言

const fn = (params: any): boolean => {
    return params as boolean
}

fn(1) // 1

元组类型

元组(Tuple)是固定数量的不同类型的元素的组合。
元组与集合的不同之处在于,元组中的元素类型可以是不同的,而且数量固定。

let arr: [number, string] = [1, "123"]

// 越界元素
arr.push(true) // 类型“boolean”的参数不能赋给类型“string | number”的参数

应用场景

定义excel 数据

let excel: [string, string, number, string][] = [
  ["title1", "name1", 1, "60"],
  ["title2", "name2", 2, "61"],
  ["title3", "name3", 3, "62"],
  ["title4", "name4", 4, "63"],
  ["title5", "name5", 5, "64"],
]

枚举类型

在javascript 没有枚举的概念,ts 帮我们定义了枚举
使用关键字 enum 定义枚举

1.数字枚举

红绿蓝 Red = 0 Green = 1 Blue= 2

enum Types {
  Red,
  Green,
  Blue
}
// 等同于
enum Types {
  Red =0,
  Green=1,
  Blue=2
}

// 增长枚举
enum Types {
  Red =3,
  Green, // 4
  Blue // 5
}
Types.Green // 4
Types.Blue // 5

2.字符串枚举

enum Types {
  Red = "red",
  Green = "green",
  Blue = "blue",
}

3.异构枚举

枚举可以混合字符串和数字的枚举

enum Types {
  No = "no",
  Yes = 1,
}

4.接口枚举

enum Types {
  Red,
  Green,
}

interface A {
  red: Types.Red
}

let a: A = {
  red: Types.Red,
}

5.常量枚举

常量枚举通过在枚举上使用 const 修饰符来定义,常量枚举不同于常规的枚举,他们会在编译阶段被删除。

const enum size {
  Width = 10,
  Height = 20,
}

6.反向映射

它包含了正向映射( name -> value)和反向映射( value -> name)
注意:不会为字符串的枚举生成反向映射

enum Types {
  Red,
  Green,
  Blue,
}

Types[Types.Red]  // Red

never 类型

TypeScript 将使用never 类型来表示不应该存在的状态

// 返回never的函数必须存在无法达到的终点
// 抛出异常,error 将不会有返回值
function error(message: string): never{
    throw new Error(message)
}
 
// 存在死循环,loop 将不会有返回值
function loop(): never{
    while (true) {
        
    }
}

never 和 void 区别

void 类型只是没有返回值,但不会出错,never 类型抛出异常没有返回值

注意:任何类型都不能赋值给 never 类型的变量

symbol 类型

symbol类型的值是通过Symbol构造函数创建的。

let sym1 = Symbol()
let sym2 = Symbol("id")

// Symbol 的值是唯一的
const s1 = Symbol()
const s2 = Symbol()
s1 === s2 // false

// 用作对象的键 tsc index.ts 在网页面上访问
let sym = Symbol()
let obj = {
  [sym]: "value",
}
obj[sym] // value

// 使用symbol定义的属性,是不能通过如下方式遍历拿到的

let sym = Symbol("key")
let obj = {
  [sym]: "value",
  name: "张三",
  age: 18,
}
// 1.for in 遍历
for (let key in obj) {
  console.log(key) // 遍历不到sym
}
// 2.Object.keys 遍历
let keys = Object.keys(obj)
console.log(keys)  // 遍历不到sym
// 3.getOwnPropertyNames
console.log(Object.getOwnPropertyNames(obj))
// 4.JSON.stringify
console.log(JSON.stringify(obj))

// 获取symbol 属性
// 1.getOwnPropertySymbols 只能拿到symbol 属性
let objSym = Object.getOwnPropertySymbols(obj)
console.log( objSym)  // [Symbol(key)]

let ownKeys = Reflect.ownKeys(obj)
console.log( ownKeys)  // ['name', 'age', Symbol(key)]

Symbol.iterator 迭代器 和 生成器 for of

支持遍历大部分类型迭代器 arr nodeList argumetns set map 等

let arr = [1, 2, 3, 4]
let iterator = arr[Symbol.iterator]()

console.log(iterator.next()) // { value: 1, done: false }
console.log(iterator.next()) // { value: 2, done: false }
console.log(iterator.next()) // { value: 3, done: false }
console.log(iterator.next()) // { value: 4, done: false }
console.log(iterator.next()) // { value: undefined, done: true }

测试用例

interface Item {
  name: string
  age: number
}

const arr: Item[] = [
  {
    name: "张三",
    age: 18,
  },
  {
    name: "李四",
    age: 20,
  },
  {
    name: "王五",
    age: 25,
  },
]

const gen = (oct: any): void => {
  let it: Iterator<any> = oct[Symbol.iterator]()
  let next: any = {
    done: false,
  }
  while (!next.done) {
    next = it.next()
    if (!next.done) {
      console.log(next.value)
    }
  }
}
gen(arr)

类型推论

TypeScript 会在没有明确的指定类型的时候推测出一个类型

let str = "123" // 推测出的类型 let str: string
str = 123 // 报错:不能将类型“number”分配给类型“string”

let str; //  推测出的类型 let str: any
str = 123
str = "123"
str = true

类型别名

使用关键字 type 定义别名

type str = string
let s: str = "123"

// 定义函数别名
type fn = () => string
let a: fn = () => "aaa"

// 定义联合类型别名
type num = string | number
let n: num = 123

// 定义值的别名
type value = boolean | 0 | '123'
let v:value = 0

内置对象

ECMAScript 内置对象

Boolean、Number、String、RegExp、Date、Error

let b: Boolean = new Boolean(true)
let n: Number = new Number(1)
let s: String = new String("123")
let d: Date = new Date()
let r: RegExp = new RegExp("^abc$")
let e:Error = new Error("error")

DOM 和 BOM 内置对象

Document、HTMLElement、Event、NodeList 等

let body: HTMLElement = document.body
let allDiv: NodeList = document.querySelectorAll('div')

// 读取div 这种需要类型断言,因为读不到返回null
let div: HTMLElement = document.querySelector('div') as HTMLDivElement

document.addEventListener("click", function (e:MouseEvent){
    console.log(e)
})

//dom元素的映射表
interface HTMLElementTagNameMap {
    "a": HTMLAnchorElement;
    "abbr": HTMLElement;
    "address": HTMLElement;
    "applet": HTMLAppletElement;
    "area": HTMLAreaElement;
    "article": HTMLElement;
    "aside": HTMLElement;
    "audio": HTMLAudioElement;
    "b": HTMLElement;
    "base": HTMLBaseElement;
    "bdi": HTMLElement;
    "bdo": HTMLElement;
    "blockquote": HTMLQuoteElement;
    "body": HTMLBodyElement;
    "br": HTMLBRElement;
    "button": HTMLButtonElement;
    "canvas": HTMLCanvasElement;
    "caption": HTMLTableCaptionElement;
    "cite": HTMLElement;
    "code": HTMLElement;
    "col": HTMLTableColElement;
    "colgroup": HTMLTableColElement;
    "data": HTMLDataElement;
    "datalist": HTMLDataListElement;
    "dd": HTMLElement;
    "del": HTMLModElement;
    "details": HTMLDetailsElement;
    "dfn": HTMLElement;
    "dialog": HTMLDialogElement;
    "dir": HTMLDirectoryElement;
    "div": HTMLDivElement;
    "dl": HTMLDListElement;
    "dt": HTMLElement;
    "em": HTMLElement;
    "embed": HTMLEmbedElement;
    "fieldset": HTMLFieldSetElement;
    "figcaption": HTMLElement;
    "figure": HTMLElement;
    "font": HTMLFontElement;
    "footer": HTMLElement;
    "form": HTMLFormElement;
    "frame": HTMLFrameElement;
    "frameset": HTMLFrameSetElement;
    "h1": HTMLHeadingElement;
    "h2": HTMLHeadingElement;
    "h3": HTMLHeadingElement;
    "h4": HTMLHeadingElement;
    "h5": HTMLHeadingElement;
    "h6": HTMLHeadingElement;
    "head": HTMLHeadElement;
    "header": HTMLElement;
    "hgroup": HTMLElement;
    "hr": HTMLHRElement;
    "html": HTMLHtmlElement;
    "i": HTMLElement;
    "iframe": HTMLIFrameElement;
    "img": HTMLImageElement;
    "input": HTMLInputElement;
    "ins": HTMLModElement;
    "kbd": HTMLElement;
    "label": HTMLLabelElement;
    "legend": HTMLLegendElement;
    "li": HTMLLIElement;
    "link": HTMLLinkElement;
    "main": HTMLElement;
    "map": HTMLMapElement;
    "mark": HTMLElement;
    "marquee": HTMLMarqueeElement;
    "menu": HTMLMenuElement;
    "meta": HTMLMetaElement;
    "meter": HTMLMeterElement;
    "nav": HTMLElement;
    "noscript": HTMLElement;
    "object": HTMLObjectElement;
    "ol": HTMLOListElement;
    "optgroup": HTMLOptGroupElement;
    "option": HTMLOptionElement;
    "output": HTMLOutputElement;
    "p": HTMLParagraphElement;
    "param": HTMLParamElement;
    "picture": HTMLPictureElement;
    "pre": HTMLPreElement;
    "progress": HTMLProgressElement;
    "q": HTMLQuoteElement;
    "rp": HTMLElement;
    "rt": HTMLElement;
    "ruby": HTMLElement;
    "s": HTMLElement;
    "samp": HTMLElement;
    "script": HTMLScriptElement;
    "section": HTMLElement;
    "select": HTMLSelectElement;
    "slot": HTMLSlotElement;
    "small": HTMLElement;
    "source": HTMLSourceElement;
    "span": HTMLSpanElement;
    "strong": HTMLElement;
    "style": HTMLStyleElement;
    "sub": HTMLElement;
    "summary": HTMLElement;
    "sup": HTMLElement;
    "table": HTMLTableElement;
    "tbody": HTMLTableSectionElement;
    "td": HTMLTableDataCellElement;
    "template": HTMLTemplateElement;
    "textarea": HTMLTextAreaElement;
    "tfoot": HTMLTableSectionElement;
    "th": HTMLTableHeaderCellElement;
    "thead": HTMLTableSectionElement;
    "time": HTMLTimeElement;
    "title": HTMLTitleElement;
    "tr": HTMLTableRowElement;
    "track": HTMLTrackElement;
    "u": HTMLElement;
    "ul": HTMLUListElement;
    "var": HTMLElement;
    "video": HTMLVideoElement;
    "wbr": HTMLElement;
}

定义Promise

如果不指定返回的类型,ts推断不出来返回什么类型

// 指定返回类型
function promise():Promise<number> {
    return new Promise((resolve, reject) => {
        resolve(1)
    })
}

promise().then(res => {
    console.log(res)
})

class 类

ts 上定义类

class Person{
    name: string
    age:number
    constructor(name:string,age:number) {
        this.name = name
        this.age = age
    }
    getName() {
        return this.name
    }
}

// 定义了变量不用也会报错,定义个默认值就不会报错了
class Person{
    name: string
    age:number = 18
    constructor(name:string,age:number) {
        this.name = name
    }
    getName() {
        return this.name
    }
}

类的修饰符

总共有三个 public private protected

使用public 修饰符定义的变量可以内部访问、外部访问, 如果不写默认就是public
使用 private 修饰符定义的变量只能在内部访问,不能在外部访问
使用 protected 修饰符定义的变量只能在内部和继承的子类中访问,不能在外部访问

class Person{
    public name: string
    private age: number
    protected pro:any
    constructor(name:string,age:number,pro:any) {
        this.name = name
        this.age = age
        this.pro = pro
    }
    getName() {
        return this.name
    }
}

let p = new Person("张三", 18, "123")

p.name
p.age // 报错:属性“age”为私有属性,只能在类“Person”中访问
p.pro // 报错:属性“pro”受保护,只能在类“Person”及其子类中访问。

class Man extends Person{
    constructor(name:string,age:number,pro:any) {
        super(name, age, pro)
        console.log(this.pro)
    }
    getPro() {
        return this.pro
    }
}

let m = new Man("张三", 18, "123")
console.log(m.getPro())

static 静态属性 和 静态方法

static 定义的属性,不能通过this 访问,只能通过类名去调用

class Person{
    public name: string
    private age: number
    protected pro: any
    static str:string = "123"
    constructor(name:string,age:number,pro:any) {
        this.name = name
        this.age = age
        this.pro = pro
        this.str // 报错:属性“str”在类型“Person”上不存在
    }
    getName() {
        return this.name
    }
}

Person.str // 123

static 静态函数,也不能通过this 访问,只能通过类名调用

class Person{
    public name: string
    private age: number
    protected pro: any
    static str:string = "123"
    constructor(name:string,age:number,pro:any) {
        this.name = name
        this.age = age
        this.pro = pro
        // this.str // 属性“str”在类型“Person”上不存在
        // this.getName() // 报错:属性“getName”在类型“Person”上不存在
    }
    static getName() {
        return this.name
    }
}

Person.getName() // Person

注意:如果两个函数都是 static 静态的,可以通过this 调用

class Person{
    public name: string
    private age: number
    protected pro: any
    static str:string = "123"
    constructor(name:string,age:number,pro:any) {
        this.name = name
        this.age = age
        this.pro = pro
        // this.str // 属性“str”在类型“Person”上不存在
        // this.getName() // 报错:属性“getName”在类型“Person”上不存在
    }
    static getName() {
        return "person name"
    }
    static run() {
        return this.getName()
    }
}

Person.run() // person name

interface 定义类

interface 定义类使用关键字 implements 后面跟interface 定义的名字,多个用逗号隔开,继承还是用extends

interface A{
    name: string
    get(type:string):string
}

interface B{
    age: number,
    set():void
}

class Aclass{
    name: string
    constructor() {
        this.name = "nameA"
    }
}

class Bclass extends Aclass implements A, B{
    age: number
    constructor() {
        super()
        this.age = 18
    }
    get(type: string): string {
        return this.name + type
    }
    set(){}
}

抽象类

抽象类无法被实例化

abstract class A{
    name: string
    constructor(name: string) {
        this.name = name
    }
}

new A() // 报错:无法创建抽象类的实例

A类定义了抽象方法,B类继承了A类,就必须实现抽象方法,不实现就报错

abstract class A{
    name: string
    constructor(name: string) {
        this.name = name
    }
    abstract getName():string
}

class B extends A{
    constructor() {
        super('张三')
    }
    getName(): string{
        return this.name
    }
}

let b = new B()

console.log(b.getName())

泛型

函数泛型

function num(a: number, b: number): Array<number> {
  return [a, b]
}
num(1,2)
function str(a: string, b: string): Array<string> {
  return [a, b]
}
str('1','2')

// 优化
function add<T>(a: T, b: T): Array<T> {
  return [a, b]
}
add<number>(1, 2)
add<string>("1", "2")

// 使用不同的泛型参数名,只要数量和使用方式对应就行
function sub<T, U>(a: T, b: U): Array<T | U> {
  return [a, b]
}

sub<boolean, string>(false, "1213")

定义泛型接口

声明接口的时,在名字后加一个<T>,使用时传递类型

interface MyInter<T> {
    (arg:T):T
}

function fn<T>(arg: T): T{
    return arg
}

let result: MyInter<number> = fn
result(1)

对象字面量泛型


let foo: { <T>(arg: T): T}

foo = function <T>(arg: T): T {
  return arg
}

foo(123)

泛型约束

interface Len {
  length: number
}

function getLen<T extends Len>(arg: T): number {
  return arg.length
}

getLen<string>("123")

使用keyof 约束对象


function getVal<T, K extends keyof T>(obj: T, key: K) {
  return obj[key]
}

let o = { a: 1, b: 2, c: 3 }

getVal(o, "a")
getVal(o,'d') // 报错:类型“"d"”的参数不能赋给类型“"a" | "b" | "c"”的参数

泛型类

声明类名称后加<T>,使用时确定类型,new Person<string>()

class Person<T> {
  names: T[] = []
  add(name: T): T[] {
    this.names.push(name)
    return this.names
  }
}

let s = new Person<string>()
s.add("1") // ['1']

let n = new Person<number>()
n.names = [1, 2, 3]
n.add(4) // [1,2,3,4]

tsconfig.json

通过 tsc --int 生成 tsconfig.json 文件

配置详解

compilerOptions": {
  "incremental": true, // TS编译器在第一次编译之后会生成一个存储编译信息的文件,第二次编译会在第一次的基础上进行增量编译,可以提高编译的速度
  "tsBuildInfoFile": "./buildFile", // 增量编译文件的存储位置
  "diagnostics": true, // 打印诊断信息 
  "target": "ES5", // 目标语言的版本
  "module": "CommonJS", // 生成代码的模板标准
  "outFile": "./app.js", // 将多个相互依赖的文件生成一个文件,可以用在AMD模块中,即开启时应设置"module": "AMD",
  "lib": ["DOM", "ES2015", "ScriptHost", "ES2019.Array"], // TS需要引用的库,即声明文件,es5 默认引用dom、es5、scripthost,如需要使用es的高级版本特性,通常都需要配置,如es8的数组新特性需要引入"ES2019.Array",
  "allowJS": true, // 允许编译器编译JS,JSX文件
  "checkJs": true, // 允许在JS文件中报错,通常与allowJS一起使用
  "outDir": "./dist", // 指定输出目录
  "rootDir": "./", // 指定输出文件目录(用于输出),用于控制输出目录结构
  "declaration": true, // 生成声明文件,开启后会自动生成声明文件
  "declarationDir": "./file", // 指定生成声明文件存放目录
  "emitDeclarationOnly": true, // 只生成声明文件,而不会生成js文件
  "sourceMap": true, // 生成目标文件的sourceMap文件
  "inlineSourceMap": true, // 生成目标文件的inline SourceMap,inline SourceMap会包含在生成的js文件中
  "declarationMap": true, // 为声明文件生成sourceMap
  "typeRoots": [], // 声明文件目录,默认时node_modules/@types
  "types": [], // 加载的声明文件包
  "removeComments":true, // 删除注释 
  "noEmit": true, // 不输出文件,即编译后不会生成任何js文件
  "noEmitOnError": true, // 发送错误时不输出任何文件
  "noEmitHelpers": true, // 不生成helper函数,减小体积,需要额外安装,常配合importHelpers一起使用
  "importHelpers": true, // 通过tslib引入helper函数,文件必须是模块
  "downlevelIteration": true, // 降级遍历器实现,如果目标源是es3/5,那么遍历器会有降级的实现
  "strict": true, // 开启所有严格的类型检查
  "alwaysStrict": true, // 在代码中注入'use strict'
  "noImplicitAny": true, // 不允许隐式的any类型
  "strictNullChecks": true, // 不允许把null、undefined赋值给其他类型的变量
  "strictFunctionTypes": true, // 不允许函数参数双向协变
  "strictPropertyInitialization": true, // 类的实例属性必须初始化
  "strictBindCallApply": true, // 严格的bind/call/apply检查
  "noImplicitThis": true, // 不允许this有隐式的any类型
  "noUnusedLocals": true, // 检查只声明、未使用的局部变量(只提示不报错)
  "noUnusedParameters": true, // 检查未使用的函数参数(只提示不报错)
  "noFallthroughCasesInSwitch": true, // 防止switch语句贯穿(即如果没有break语句后面不会执行)
  "noImplicitReturns": true, //每个分支都会有返回值
  "esModuleInterop": true, // 允许export=导出,由import from 导入
  "allowUmdGlobalAccess": true, // 允许在模块中全局变量的方式访问umd模块
  "moduleResolution": "node", // 模块解析策略,ts默认用node的解析策略,即相对的方式导入
  "baseUrl": "./", // 解析非相对模块的基地址,默认是当前目录
  "paths": { // 路径映射,相对于baseUrl
    // 如使用jq时不想使用默认版本,而需要手动指定版本,可进行如下配置
    "jquery": ["node_modules/jquery/dist/jquery.min.js"]
  },
  "rootDirs": ["src","out"], // 将多个目录放在一个虚拟目录下,用于运行时,即编译后引入文件的位置可能发生变化,这也设置可以虚拟src和out在同一个目录下,不用再去改变路径也不会报错
  "listEmittedFiles": true, // 打印输出文件
  "listFiles": true// 打印编译的文件(包括引用的声明文件)
}
 
// 指定一个匹配列表(属于自动指定该路径下的所有ts相关文件)
"include": [
   "src/**/*"
],
// 指定一个排除列表(include的反向操作)
 "exclude": [
   "demo.ts"
],
// 指定哪些文件使用该配置(属于手动一个个指定文件)
 "files": [
   "demo.ts"
]

介绍几个常用的

1.include
指定编译文件,默认是编译当前目录下所有的ts文件

2.exclude
指定排除的文件

3.target
指定编译js 的版本例如es5 es6

4.allowJS
是否允许编译js文件

5.removeComments
是否在编译过程中删除文件中的注释

6.rootDir
编译文件的目录

7.outDir
输出的目录

8.sourceMap
代码源文件

9.strict
严格模式

10.module
默认common.js 可选es6模式 amd umd 等

相关文章

网友评论

      本文标题:typescript 入门

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