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

    正文概述 掘金(倒影)   2021-03-08   805

    更智能的保留类型别名

    Typescript可以为类型声明新的名称,即类型别名

    type BasicPrimitive = number | string | boolean
    
    type BasicPrimitiveOrSymbal = BasicPrimitive | symbol
    

    Visual Studio CodeTypeScript Playground 之类的编辑器上,将鼠标悬停于想查看的类型之上时,会展示一个信息面板,显示其类型。鼠标悬停查看BasicPrimitiveOrSymbal

    在4.2之前的版本中

    Typescript 4.2新特性一览

    在4.2中

    Typescript 4.2新特性一览

    可以看出在4.2版本中,对类型别名进行了保留

    信息面板中展示的类型就是TS对此类型的推断,故此规则也适用于编译出的类型声明文件(.d.ts输出)

    export type BasicPrimitive = number | string | boolean;
    export function doStuff(value: BasicPrimitive) {
        if (Math.random() < 0.5) {
            return Symbal();
        }
        return value;
    }
    

    如上函数doStuff的返回值在4.2以下版本将被推断为number | string | boolean | symbol,在4.2中将会被推断为BasicPrimitive | symbol

    编译输出的*.d.ts文件,在4.2之前的版本中

    export declare type BasicPrimitive = number | string | boolean;
    export declare function doStuff(value: BasicPrimitive): string | number | boolean | symbol;
    

    在4.2版本中

    export declare type BasicPrimitive = number | string | boolean;
    export declare function doStuff(value: BasicPrimitive): symbol | BasicPrimitive;
    
    

    Rest参数可用于元祖的任何位置

    type T1 = [...string[], number] // 任意个string跟着一个number
    
    type T2 = [number, ...string[], number] // string之前各有一个number
    

    在之前版本中Rest参数只能在元祖末尾处使用

    type T1 = [number, ...string[]] // number后跟着任意个string
    
    type T2 = [boolean, ...string[], number] // ❌ error: A rest element must be last in a tuple type
    

    在4.0版本中可以通过定义类型别名的方式规避报错,但类型会被推断为Rest参数的类型和其后所有类型的联合类型

    type t1 = string[]
    
    type t2 = [boolean, ...t1, number] // 被推断为[boolean, ...(string | number)[]]
    

    虽在4.2版本中Rest参数可用于元祖的任意位置,但仍有一些限制

    • 元祖中只能有一个Rest参数
    • Rest参数后不能出现可选参数
    type T1 = [...string[], ...number[]] // ❌ error: A rest element cannot follow another rest element.
    
    type T2 = [...string[], number?] // ❌ error: An optional element cannot follow a rest element.
    

    对第一条规则4.2.2版本仍可以通过定义类型别名的方式规避报错

    type T1 = number[]
    
    type T2 = [...string[], ...T] // 被推断为 (string | number)[]
    

    --noPropertyAccessFromIndexSignature标志

    开启标志后索引签名中未显式声明的属性通过.操作符访问将会抛出一个错误。具体是否使用看个人习惯

    interface Option {
        name: string;
        [x: string]: any;
    }
    
    declare const a: Option
    
    let b = a['age']
    
    let c = a.age // ❌ error:  Property 'age' comes from an index signature, so it must be accessed with ['age']
    

    abstract构造符

    再类上使用abstract声明,表明类只能被继承,而不能被通过new操作符调用

    而这带来的一个问题是,抽象类与new (...args: any) => any不兼容

    abstract class Shape {
        abstract name: string;
        abstract getArea(): number;
    }
    
    new Shape() // error: Cannot create an instance of an abstract class.
    
    const a: new (...args: any) => any = Shape // ❌ error: Type 'typeof Shape' is not assignable to type 'new (...args: any) => any'.
    
    // InstanceType内置类型也用了new (...args: any) => any实现的
    type MyInstance = InstanceType<typeof Shape> // ❌ error: Type 'typeof Shape' is not assignable to type 'new (...args: any) => any'.
    

    而在TS 4.2中abstract可作为构造符使用,由此就可以定义一个获取抽象类示例类型的别名

    type AbstractInstanceType<T extends abstract new (...args: any) => any> = T extends abstract new (...args: any) => infer R ? R : any
    
    type MyInstance = AbstractInstanceType<typeof Shape>; // Shape
    

    --explainFiles标志

    使用此标志去编译,TS将给出非常详细的关于import信息的说明

    tsc --explainFiles
    

    打印例子如下:

    node_modules/typescript/lib/lib.d.ts
      Default library
    node_modules/typescript/lib/lib.es5.d.ts
      Library referenced via 'es5' from file 'node_modules/typescript/lib/lib.es2015.d.ts'
      Library referenced via 'es5' from file 'node_modules/typescript/lib/lib.d.ts'
    node_modules/typescript/lib/lib.es2015.d.ts
      Library referenced via 'es2015' from file 'node_modules/typescript/lib/lib.es2016.d.ts'
    node_modules/typescript/lib/lib.es2016.d.ts
      Library referenced via 'es2016' from file 'node_modules/typescript/lib/lib.es2017.d.ts'
    node_modules/typescript/lib/lib.es2017.d.ts
    ...
    

    此外,还可以指定信息的输出位置

    # 将信息输出到.text文件
    tsc --explainFiles > expanation.txt
    
    # 将信息输出到 VS Code
    
    tsc --explainFiles | code -
    

    改进逻辑表达式中的未调用函数检查

    在使用--strictNullChecks时,&&||将进行未调用函数检查

    function foo() { return false }
    
    function is_foo_1() { return foo ? 1 : 0 } // ❌ error: This condition will always return true since the function is always defined. Did you mean to call it instead
    
    function is_foo_2() { return foo && 1 } // ❌ error: This condition will always return true since the function is always defined. Did you mean to call it instead
    
    function is_foo_3() { return foo || 1 } // ❌ error: This condition will always return true since the function is always defined. Did you mean to call it instead
    

    解构变量可以显式标记为未使用

    在解构的变量名上通过前缀增加下划线_的方式显式声明该变量不使用

    let [_first, second] = getValues();
    

    参考资料

    Announcing TypeScript 4.2


    起源地下载网 » Typescript 4.2新特性一览

    常见问题FAQ

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

    发表评论

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

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

    联系作者

    请选择支付方式

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