本篇内容不波及TypeScript装置以及配置,只波及TypeScript语法相干内容。不讲废话,简略间接。

1、原始类型

const a: string = 'foo'const b: number = 100const c: boolean = trueconst d: void = undefinedconst e: null = nullconst f: undefined = undefinedconst g: symbol = Symlol()

2、object 类型

object并不单指对象,而是指除了原始类型以外的其余类型
const foo: object = function () {} // [] // {}const obj: { foo: number,bar: string } = { foo: 123, bar: 'string' }

3、数组类型

// 第一种定义形式,元素类型设置为 *number*const arr1: Array<number> = [1, 2, 3]// 第二种定义形式,较为常见const arr2: number[] = [1, 2, 3]// 例子function sum (...args: number[]) {    // 传统做法是要判断传入的参数是否是数字,       而TypeScript中只须要像下面这样对参数做一个类型注解,就行了    return args.reduce(prev, current) => prev + current, 0)}sum(1, 2, 3, 'foo') // 这里传入了一个非数字的值就会报错

4、元组类型

元组就是一个明确元素数量明确元素类型 的数组
const tuple: [number, string] = [18, 'foo']// const tuple: [number, string] = [18, 18] 类型不匹配,会报错// const tuple: [number, string] = [18, 'foo', 'xxx'] 数量不匹配,会报错// 拜访const age = tuple[0]const name = tuple[1]// 解构const [age, name] = tuple

5、enum 类型

// enum 对象的属性能够不必赋值,默认从0开始递增,   也能够赋值Draft = 5,前面的就从5开始递增   也能够给具体的值,比方 Draft = 'xxx',这样前面的属性都要给具体的值enum PostStatus {    Draft = 0,    Unpublished = 1,    Published = 2}const post = {    title: 'Hello TypeScript',    content: 'TypeScript is a typed superset of JavaScript.',    status: PostStatus.Draft // 0 // 1 // 2}

6、函数类型

// 申明式函数// 参数a和b是number类型,函数返回是string类型,// 参数后带问号代表是可选参数// 当参数数量不固定的时候能够应用rest运算符来承受参数,类型是一个值为number的数组function func1 (a: number, b?: number, ...rest: number[]): string {    return 'func1'}// 函数表达式定义函数const func2 = function (a: number, b: number): string {    return 'func2'}// 如果把一个函数作为参数传递,相似callback函数。function fntD(callback: (bl: boolean) => boolean) {    callback(true)}function callback(bl: boolean): boolean {    console.log(bl)    return bl}const dResult = fntD(callback)

7、任意类型 any

// value 能够承受任意类型function stringfy (value: any) {    return JSON.stringify(value)}stringify('string')stringify(10)stringify(true)// foo 能够任意赋值let foo: any = 'string'foo = 100

8、隐式类型推断

// age 赋值为 number 类型let age = 18 // numberage = 'string' // 会正告谬误,因为age是number类型let foo // 没有赋值,就是any类型foo = 100foo = 'string'

9、类型断言 as

// 假设这个 nums 来自一个明确的接口const nums = [110, 120, 119, 112]// 这里TypeScript推断res的类型为 number|undefined// 因为它并不知道这个i到底在数组中有没有const res = nums.find(i => i > 0)// 这里就会报错正告const square = res * res// 如果咱们间接 断言 这个 res 就是 number 类型const num1 = res as number// 这里就不会报错了const square = res * res

10、接口 interface

接口用来约定对象的构造,一个对象要实现一个接口,就必须领有这个接口中所蕴含的所有成员
interface Post {    title: string    content: string}function printPost (post: Post) {    console.log(post.title)    console.log(post.content)}printPost({    title: 'Hello TypeScript',    content: 'A JavaScript superset'})// 非凡的接口成员 可选成员 只读成员interface Post{    title: string    content: string    subtitle?: string // 加问号就是可选成员    readonly summary: string // 加 readonly 就是只读成员}const hello: Post = {    title: 'Hello TypeScript',    content: 'A javascript superset',    summary: 'a javascript'}hello.summary = 'other' // 会报错,因为 summary 是只读成员// 动静成员interface Cache {    [prop: string]: string}const cache: Cache = {}cache.foo = 'value1'cache.bar = 'value2'

11、类 Class

Class Person {    // 在这里赋值,和在构造函数中初始化必须两者选其一    name: string // = 'init name' 这里能够间接初始化    private age: number // 这里定义 age 为公有属性    protected gender: boolean // 受爱护的类型    readonly national: string // 只读属性,一经初始化,不可更改    constructor (name: string, age: number) {        // 须要在下面标注出构造函数中属性的类型        this.name = name        this.age = age        this.gender = true        this.national = national    }    sayHi (msg: string): void {        console.log(`I am ${this.name}, ${msg}`)        console.log(this.age)    }}const tom = new Person('tom', 18)console.log(tom.name) // tomconsole.log(tom.age) // 报错,因为 age 是公有属性,所以拜访不到console.log(tom.gender) // 报错,因为 gender 是受爱护的属性,这里拜访不到// 在下方新申明一个类 student 继承与 Personclass Student extends Person {    constructor (name: string, age: number) {    super(name, age)    console.log(this.gender) // 这里就一个拜访到 受爱护的属性 gender}

12、类与接口

implements 实现

interface Eat {    eat (food: string): void}interface Run {    run (distance: number): void}// Person类,实现了 Eat 和 Run 两个接口class Person implements Eat, Run {    eat (food: string): void {        console.log(`优雅的进餐:${food}`)    }        run (distance: number) {        console.log(`直立行走:${distance}`)    }}// Animal类,实现了 Eat 和 Run 两个接口class Animal implements Eat, Run {    eat (food: string): void {        console.log(`狼吞虎咽的吃:${food}`)    }        run (distance: number) {        console.log(`匍匐:${distance}`)    }}

13、抽象类

abstract 定义抽象类,抽象类只能被继承,不能通过 new 的形式创立实例对象
// 定义一个抽象类 Animalabstract class Animal {    eat (food: string): void {        console.log(`狼吞虎咽的吃:${food}`)    }        // 定义一个形象办法 run,能够不须要办法体。    // 定义了形象办法之后,子类中必须实现这个形象办法    abstract run (distance: number): void}class Dog extends Animal {    run(distance: number): void {        console.log('四脚匍匐', distance)    }}const d = new Dog()d.eat('嘎嘎') // 狼吞虎咽的吃:嘎嘎d.run(100) // 四脚匍匐 100

14、泛型 Generics

泛型是指在定义接口函数类的时候,没有指定具体的类型,等到咱们在应用的时候再去指定具体的类型的这种特色
// 这里申明一个创立 number 类型数组的函数 creatNumberArrayfunction createNumberArray (length: number, value: number): number[] {    // 这里的Array是 any 类型,所以要给它指定一个 Number 类型    const arr = Array<number>(length).fill(value)    return arr}// 这里申明一个创立 String 类型数组的函数 createStringArrayfunction createStringArray (length: number, value: string): string[] {    const arr = Array<string>(length).fill(value)    return arr}// 因为下面的两个函数代码有冗余,所以这里咱们能够应用 泛型// 个别咱们应用 T 来作为泛型参数的名称,而后把函数中不明确的类型都改为 T 来做代表function createArray<T> (length: number, value: T): T[] {    const arr = Array<T>(length).fill(value)    return arr}// 而后应用泛型的时候 传递 T 的类型const res = creatArray<string>(3,'foo')// const res = createNumberArray(3, 100)// res => [100, 100, 100]

根底语法篇到这里完结,更多对于TypeScript的应用请关注我,继续为大家更新。