最新公告
  • 欢迎您光临网站无忧模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • TypeScript 多个最佳通用类型候选和泛型接口

    正文概述 掘金(Koi是攻城狮呦)   2021-08-27   539

    1 多个最佳通用类型候选

    当有多个最佳通用类型可用时,现在编译器会做出选择(依据编译器的具体实现)而不是直接使用第一个。

     var a: { x: number; y?: number };
     var b: { x: number; z?: number };
     ​
     // 之前 { x: number; z?: number; }[]
     // 现在 { x: number; y?: number; }[]
     var bs = [b, a];
    

    这会在多种情况下发生。具有一组共享的必需属性和一组其它互斥的(可选或其它)属性,空类型,兼容的签名类型(包括泛型和非泛型签名,当类型参数上应用了any时)。

    推荐 使用类型注解指定你要使用的类型。

     var bs: { x: number; y?: number; z?: number }[] = [b, a];
    

    2 泛型接口

    当在多个T类型的参数上使用了不同的类型时会得到一个错误,就算是添加约束也不行:

     declare function foo<T>(x: T, y:T): T;
     var r = foo(1, ""); // r used to be {}, now this is an error
    

    添加约束:

     interface Animal { x }
     interface Giraffe extends Animal { y }
     interface Elephant extends Animal { z }
     function f<T extends Animal>(x: T, y: T): T { return undefined; }
     var g: Giraffe;
     var e: Elephant;
     f(g, e);
    

    在这里查看详细解释。

    推荐 如果这种不匹配的行为是故意为之,那么明确指定类型参数:

     var r = foo<{}>(1, ""); // Emulates 1.0 behavior
     var r = foo<string|number>(1, ""); // Most useful
     var r = foo<any>(1, ""); // Easiest
     f<Animal>(g, e);
    

    重写函数定义指明就算不匹配也没问题:

     declare function foo<T,U>(x: T, y:U): T|U;
     function f<T extends Animal, U extends Animal>(x: T, y: U): T|U { return undefined; }
    

    泛型剩余参数

    不能再使用混杂的参数类型:

     function makeArray<T>(...items: T[]): T[] { return items; }
     var r = makeArray(1, ""); // used to return {}[], now an error
    

    new Array(...)也一样

    推荐 声明向后兼容的签名,如果1.0的行为是你想要的:

     function makeArray<T>(...items: T[]): T[];
     function makeArray(...items: {}[]): {}[];
     function makeArray<T>(...items: T[]): T[] { return items; }
    

    3 带类型参数接口的重载解析

     var f10: <T>(x: T, b: () => (a: T) => void, y: T) => T;
     var r9 = f10('', () => (a => a.foo), 1); // r9 was any, now this is an error
    

    推荐 手动指定一个类型参数

     var r9 = f10<any>('', () => (a => a.foo), 1);
    

    4 类声明与类型表达式以严格模式解析

    ECMAScript 2015语言规范(ECMA-262 6th Edition)指明ClassDeclarationClassExpression使用严格模式。 因此,在解析类声明或类表达式时将使用额外的限制。

    例如:

     class implements {}  // Invalid: implements is a reserved word in strict mode
     class C {
         foo(arguments: any) {   // Invalid: "arguments" is not allow as a function argument
             var eval = 10;      // Invalid: "eval" is not allowed as the left-hand-side expression
             arguments = [];     // Invalid: arguments object is immutable
         }
     }
    

    关于严格模式限制的完整列表,请阅读 Annex C - The Strict Mode of ECMAScript of ECMA-262 6th Edition。


    下载网 » TypeScript 多个最佳通用类型候选和泛型接口

    常见问题FAQ

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

    发表评论

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

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

    联系作者

    请选择支付方式

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