• 06 ts扩展知识


     

    目录

    ts模块化

    命名空间

    类型声明

    tsconfig.json文件

    条件类型(了解)

    条件类型-类型推断infer

    分发条件类型

    内置工具-类型体操

    Partial

    Required

    Readonly

    Record

    pick

    omit

    其他


    ts模块化

     ts从2012年开始跟进模块化,ts支持多种模块化方案

    2015年esmodule发布,所以在ts中最主要使用的模块化方案就是es module

    用法与在js中使用无异,这里说明一些特殊用法

     内置类型导入

    1. // 导入其他函数与js的esmodule一样
    2. import {sum} from './utils/Math'
    3. // 在导入类型时,最好加上type
    4. import {type IPerson,type IKun} from './utils/type'
    5. // 加上type优点: 在babel等进行打包编译时可以去掉
    6. // 其他写法: 当导入的全是type时,type可以写在外边
    7. // import type {IPerson, IKun} from './utils/type'
    8. console.log(sum(10,20));
    9. const obj: IPerson = {
    10. name: 'zhao',
    11. age: 12
    12. }

    命名空间

    ts在ES module前推出的模块化方案,现已经不推荐使用

    1. // 命名空间,不同命名空间变量名可重复
    2. namespace price {
    3. function format() {}
    4. const name = 'xx'
    5. }
    6. // 导出
    7. export namespace data {
    8. // 这个也需要导出
    9. export function format() {}
    10. // 没导出只能自己内部使用
    11. const name = 'zz'
    12. }

    类型声明

    在我们开发中所用的类型,有些是我们自己写的,但也用到了一些别的内容(HTMLDivElement)

    这些类型来自哪里?这与ts类型的管理与查找规则有关

    .d.ts文件

    类型声明文件 .d.ts文件 用来做类型声明, 不能在里面写逻辑代码,

    仅仅用来做类型检测,告诉ts我们有哪些类型

    类型分明大致分为三种:

        1,内置类型声明(HTMLImageElement,Promise等)

        2,外部定义类型声明(我们引入的第三方库,例如axios)

        3,自己定义类型声明

    tsconfig.json文件

    作用一:  让TypeScript Compiler在编译时,知道如何去编译ts和进行类型检测

        比如: 将ts代码编译成什么版本的javascript代码,

    作用二:  让编译器(vscode)可以按照正确的方式识别ts代码

        比如:  对那些语法进行提示,类型错误检测等等

    tsconfig.json在编译时如何被使用?

    在调用tsc时,指定文件,tsc index.ts 会将改文件编译成js文件

    只使用tsc命令,找到包含tsconfig.json目录(根目录)编译所有ts文件

    webpack中使用ts-loader进行打包时,会自动读取tsconfig文件,根据配置编译ts代码

    tsconfig.json常用选项

    当我们在开发中,选择ts模板时,会自动配好,一般不需要我们修改

    条件类型(了解)

    1. type myType = number | string
    2. // 语法: type1 extends type2 ? trueType : falseType
    3. // 类似于js中的三元运算符 如果type1继承type2则返回trueType,否则返回falseType
    4. // 只有extends这一种判断
    5. //应用
    6. // function sum(num1: number,num2: number): number
    7. // function sum(num1: string,num2: string): string
    8. function sumextends myType>(num1: T,num2: T): T extends number ? number : string
    9. function sum(num1: any, num2: any) {
    10. console.log(num1+num2);
    11. return num1+num2
    12. }
    13. sum('str','xxx')
    14. sum(1,2)
    15. export {}

    条件类型-类型推断infer

    1. // 条件类型提供了infer关键词,可以从正在比较的类型中推断类型,然后再true分支中引用
    2. // 应用: 假如我们现在有一个函数类型,获取他的参数类型与返回值类型
    3. // ts有内置工具ReturnType
    4. type fnType = ()=>void
    5. type fnType2 = (num1: number,num2: number)=>number
    6. type fnType3 = (num1: string,num2: string)=>string
    7. type resType = ReturnType
    8. // 获取返回值类型
    9. type myReturnTypeextends (...args: any[])=>any> = T extends (...args: any[])=> infer R ? R : never
    10. // 获取参数类型
    11. type myParamsTypeextends (...args: any[])=>any> = T extends (...args: infer P)=> any ? P : never
    12. // 测试
    13. type resType2 = myReturnType
    14. type resType3 = myReturnType
    15. type resType4 = myParamsType
    16. type resType5 = myParamsType

    分发条件类型

    1. // 当我们在泛型中使用条件类型,如果传入一个联合类型,就会变成分发的
    2. // 应用: toArray
    3. type toArray = T[]
    4. type numArr = toArray<number>
    5. type numStrArr = toArray<number | string> // (number | string)[] 想要的是 number[] | string[]
    6. // 分发条件类型
    7. type toArray2 = T extends any ? T[] : never
    8. type numStrArr2 = toArray2<number | string> // number[] | string[]

    内置工具-类型体操

    Partial

    1. // 将一个对象类型的所有参数变成可选的
    2. interface IKun {
    3. name: string,
    4. age: number,
    5. slogan: string
    6. }
    7. type newIKun = Partial<IKun>
    8. // 实现
    9. type MyPartial = {
    10. [P in keyof T]?: T[P]
    11. }
    12. type newIKun2 = MyPartial<IKun>

    Required

    1. // 将一个对象类型的所有参数变成必选的
    2. interface IKun {
    3. name: string,
    4. age: number,
    5. slogan?: string
    6. }
    7. type newIKun = Required<IKun>
    8. // 实现
    9. type MyRequired = {
    10. [P in keyof T]-?: T[P]
    11. }
    12. type newIKun2 = MyRequired<IKun>
    13. export {}

    Readonly

    1. // 将一个对象类型的所有参数变成必选的
    2. interface IKun {
    3. name: string,
    4. age: number,
    5. slogan?: string
    6. }
    7. type newIKun = Readonly<IKun>
    8. // 实现
    9. type MyReadonly = {
    10. readonly [P in keyof T]: T[P]
    11. }
    12. type newIKun2 = MyReadonly<IKun>
    13. export {}

    Record

    1. // record: 接受两个参数,返回一个对象类型
    2. //第一个参数是一个联合类型,每一项作为key
    3. // 第二个参数作为value
    4. interface IKun {
    5. name: string,
    6. age: number,
    7. slogan?: string
    8. }
    9. type keys = '上海' | '北京'
    10. type newIKun = RecordIKun>
    11. const IKun1: newIKun = {
    12. '上海' : {
    13. name: 'xxx',
    14. age: 10
    15. },
    16. '北京' :{
    17. name: 'yyy',
    18. age: 5
    19. }
    20. }
    21. // 实现
    22. // K必须是联合类型,keyof any返回 number | string | symbol
    23. type MyRecordextends keyof any,T> = {
    24. [P in K]: T
    25. }
    26. type newIKun2 = MyRecordIKun>
    27. export {}

    pick

    1. // pick: 接受两个参数,
    2. // 第一个参赛: 一个对象类型
    3. // 第二个参数: 第一个参数key的联合类型的子集
    4. // 返回: 一个对象类型,所有的key是第二个参数选项
    5. interface IKun {
    6. name: string,
    7. age: number,
    8. slogan?: string
    9. }
    10. type newIKun = Pick<IKun,'name'| 'slogan'>
    11. // 结果
    12. // type newIKun = {
    13. // name: string;
    14. // slogan?: string | undefined;
    15. // }
    16. // 实现
    17. type MyPickextends keyof T> = {
    18. [P in K]: T[P]
    19. }
    20. type newIKun2 = MyPick<IKun,'name'| 'slogan'>
    21. export {}

    omit

    1. // omit: 作用与pick相反 接受两个参数,
    2. // 第一个参赛: 一个对象类型
    3. // 第二个参数: 第一个参数key的联合类型的子集
    4. // 返回: 一个对象类型,去除第二个参数的key
    5. interface IKun {
    6. name: string,
    7. age: number,
    8. slogan?: string
    9. }
    10. type newIKun = Omit<IKun,'name'| 'slogan'>
    11. // 结果
    12. // type newIKun = {
    13. // age: number;
    14. // }
    15. // 实现
    16. type MyOmitextends keyof T> = {
    17. // 获取所有key,看key在不在K中,做一次判断
    18. [P in keyof T as P extends K ? never : P]: T[P]
    19. }
    20. type newIKun2 = MyOmit<IKun,'name'| 'slogan'>
    21. export {}

    其他

    exclude<联合类型,去除的项>

    extract<联合类型,只包含的项>

    NonNullable<联合类型> : 去除联合类型中的null与undefined

  • 相关阅读:
    Java的idea不能新建java class
    【Android动画】之Tween动画 (渐变、缩放、位移、旋转)
    单例模式——C++版本
    USB Server助力苏美达,Ukey连接虚拟前置机
    YOLO系列 --- YOLOV7算法(三):YOLO V7算法train.py代码解析
    visual studio code中base环境切换的问题
    Python每日一练 01
    JS-BOM-阶乘计算
    深度学习自学笔记六:深层神经网络
    ElasticSearch 索引设计
  • 原文地址:https://blog.csdn.net/yunbabac/article/details/127568665