最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • TypeScript

    正文概述 掘金(辉不想说话77944)   2021-04-24   588

    静态类型与动态类型

    在动态语言JS中,变量是没有类型的。而存放在里面的值是有类型的

    let foo = 100
    foo = '张三' // foo, 此时变为字符串类型
    
    • 类型安全:强类型、弱类型(是否允许隐式类型转换:'100' - 50 ,这里其实是可以计算的)
    • 类型检查:静态类型、动态类型(是否允许修改变量的类型)

    基本数据类型

    // 原始数据类型
    
    const a: string = 'foobar'
    
    const b: number = 100 // NaN Infinity
    
    const c: boolean = true // false
    
    // 在非严格模式(strictNullChecks)下,
    // string, number, boolean 都可以为空
    // const d: string = null
    // const d: number = null
    // const d: boolean = null
    
    const e: void = undefined
    
    const f: null = null
    
    const g: undefined = undefined
    
    // Symbol 是 ES2015 标准中定义的成员,
    // 使用它的前提是必须确保有对应的 ES2015 标准库引用
    // 也就是 tsconfig.json 中的 lib 选项必须包含 ES2015
    const h: symbol = Symbol()
    
    // Promise
    
    // const error: string = 100
    

    作用域

    • 默认文件中的成员会作为全局成员
    • 多个文件中有相同成员就会出现冲突
    // const a = 123
    
    // 解决办法1: IIFE 提供独立作用域
        (function () {
          const a = 123
        })()
    
    // 解决办法2: 在当前文件使用 export,也就是把当前文件变成一个模块
    // 模块有单独的作用域
        const a = 123
        export {}
    

    Object 类型

    export {} // 确保跟其它示例没有成员冲突
    
    // object 类型是指除了原始类型以外的其它类型
    const foo: object = function () {} // [] // {}
    
    // 如果需要明确限制对象类型,则应该使用这种类型对象字面量的语法,或者是「接口」
    const obj: { foo: number, bar: string } = { foo: 123, bar: 'string' }
    

    数组类型

    // 数组类型的两种表示方式
    
    const arr1: Array<number> = [1, 2, 3]
    
    const arr2: number[] = [1, 2, 3]
    
    // 案例 -----------------------
    
    // 如果是 JS,需要判断是不是每个成员都是数字
    // 使用 TS,类型有保障,不用添加类型判断
    function sum (...args: number[]) {
      return args.reduce((prev, current) => prev + current, 0)
    }
    
    sum(1, 2, 3) // => 6
    

    元组(Tuple)

    const tuple: [number, string] = [18, 'zce']
    
    // const age = tuple[0]
    // const name = tuple[1]
    
    const [age, name] = tuple
    
    // ---------------------
    
    const entries: [string, number][] = Object.entries({
      foo: 123,
      bar: 456
    })
    
    const [key, value] = entries[0]
    // key => foo, value => 123
    

    枚举(Enum)

    // 用对象模拟枚举
    // const PostStatus = {
    //   Draft: 0,
    //   Unpublished: 1,
    //   Published: 2
    // }
    
    // 标准的数字枚举
    // enum PostStatus {
    //   Draft = 0,
    //   Unpublished = 1,
    //   Published = 2
    // }
    
    // 数字枚举,枚举值自动基于前一个值自增
    // enum PostStatus {
    //   Draft = 6,
    //   Unpublished, // => 7
    //   Published // => 8
    // }
    
    // 字符串枚举
    // enum PostStatus {
    //   Draft = 'aaa',
    //   Unpublished = 'bbb',
    //   Published = 'ccc'
    // }
    
    // 常量枚举,不会侵入编译结果
    const enum PostStatus {
      Draft,
      Unpublished,
      Published
    }
    
    const post = {
      title: 'Hello TypeScript',
      content: 'TypeScript is a typed superset of JavaScript.',
      status: PostStatus.Draft // 3 // 1 // 0
    }
    
    // PostStatus[0] // => Draft
    

    函数类型

    function func1 (a: number, b: number = 10, ...rest: number[]): string {
      return 'func1'
    }
    
    func1(100, 200)
    
    func1(100)
    
    func1(100, 200, 300)
    
    // -----------------------------------------
    
    const func2: (a: number, b: number) => string = function (a: number, b: number): string {
      return 'func2'
    }
    

    任意类型(弱类型)

    • any 类型是不安全的
    export {} // 确保跟其它示例没有成员冲突
    
    function stringify (value: any) {
      return JSON.stringify(value)
    }
    
    stringify('string')
    
    stringify(100)
    
    stringify(true)
    
    let foo: any = 'string'
    
    foo = 100
    
    foo.bar()
    

    隐式类型推断

    • 虽然有类型推断,但还是建议,为每个变量添加明确的类型标注
    export {} // 确保跟其它示例没有成员冲突
    
    let age = 18 // number
    
    // age = 'string'
    
    let foo
    
    foo = 100
    
    foo = 'string'
    

    类型断言

    • 2种方式,但更建议用as
    export {} // 确保跟其它示例没有成员冲突
    
    // 假定这个 nums 来自一个明确的接口
    const nums = [110, 120, 119, 112]
    
    const res = nums.find(i => i > 0)
    
    // const square = res * res
    
    const num1 = res as number
    
    const num2 = <number>res // JSX 下不能使用
    

    接口

    约定对象中的结构,约定了必须要有其成员。有点类似前后端配合的接口文档

    export {} // 确保跟其它示例没有成员冲突
    
    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'
    })
    

    可选成员、只读成员、动态成员

    ?表示可有可无

    export {} // 确保跟其它示例没有成员冲突
    
    // -------------------------------------------
    
    interface Post {
      title: string
      content: string
      subtitle?: string
      readonly summary: string
    }
    
    const hello: Post = {
      title: 'Hello TypeScript',
      content: 'A javascript superset',
      summary: 'A javascript'
    }
    
    // hello.summary = 'other'
    
    // ----------------------------------
    
    interface Cache {
      [prop: string]: string
    }
    
    const cache: Cache = {}
    
    cache.foo = 'value1'
    cache.bar = 'value2'
    

    类(Class)

    class Person {
      name: string // = 'init name'
      age: number
      
      constructor (name: string, age: number) {
        this.name = name
        this.age = age
      }
    
      sayHi (msg: string): void {
        console.log(`I am ${this.name}, ${msg}`)
      }
    }
    

    类的访问修饰符

    export {} // 确保跟其它示例没有成员冲突
    
    class Person {
      public name: string // = 'init name'
      private age: number
      protected gender: boolean
      
      constructor (name: string, age: number) {
        this.name = name
        this.age = age
        this.gender = true
      }
    
      sayHi (msg: string): void {
        console.log(`I am ${this.name}, ${msg}`)
        console.log(this.age)
      }
    }
    
    class Student extends Person {
      private constructor (name: string, age: number) {
        super(name, age)
        console.log(this.gender)
      }
    
      static create (name: string, age: number) {
        return new Student(name, age)
      }
    }
    
    const tom = new Person('tom', 18)
    console.log(tom.name)
    // console.log(tom.age)
    // console.log(tom.gender)
    
    const jack = Student.create('jack', 18)
    

    类的只读属性

    public(默认)、private、protected、readonly

    export {} // 确保跟其它示例没有成员冲突
    
    class Person {
      public name: string // = 'init name'
      private age: number
      // 只读成员
      protected readonly gender: boolean
      
      constructor (name: string, age: number) {
        this.name = name
        this.age = age
        this.gender = true
      }
    
      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)
    // tom.gender = false
    

    类与接口

    interface Eat {
      eat (food: string): void
    }
    
    interface Run {
      run (distance: number): void
    }
    
    class Person implements Eat, Run {
      eat (food: string): void {
        console.log(`优雅的进餐: ${food}`)
      }
    
      run (distance: number) {
        console.log(`直立行走: ${distance}`)
      }
    }
    
    class Animal implements Eat, Run {
      eat (food: string): void {
        console.log(`呼噜呼噜的吃: ${food}`)
      }
    
      run (distance: number) {
        console.log(`爬行: ${distance}`)
      }
    }
    

    抽像类

    • 不包含具体实现,比如大的类
    • 只能被继承,只能new
    abstract class Animal {
      eat (food: string): void {
        console.log(`呼噜呼噜的吃: ${food}`)
      }
    
      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)
    

    泛型

    定义函数,接口时,没有指定具体类型,等使用时,再去指定

    function createNumberArray (length: number, value: number): number[] {
      const arr = Array<number>(length).fill(value)
      return arr
    }
    
    function createStringArray (length: number, value: string): string[] {
      const arr = Array<string>(length).fill(value)
      return arr
    }
    
    function createArray<T> (length: number, value: T): T[] {
      const arr = Array<T>(length).fill(value)
      return arr
    }
    
    // const res = createNumberArray(3, 100)
    // res => [100, 100, 100]
    
    const res = createArray<string>(3, 'foo')
    

    类型声明

    使用时 declare 对应的声明

    import { camelCase } from 'lodash'
    import qs from 'query-string'
    
    qs.parse('?key=value&key2=value2')
    
    // declare function camelCase (input: string): string
    
    const res = camelCase('hello typed')
    

    起源地下载网 » TypeScript

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元