TypeScript 4.3 Beta.

2021-04-07 03:11:19

要使用测试版开始,您可以通过Nuget获取它,或使用以下命令使用NPM:

在JavaScript中,API将在存储之前转换在存储之前传递的值非常常见。这通常会发生气体和定居者。例如,让我们想象一下,我们有一个带有Setter的类,始终将值转换为一个数字,然后在私有字段中保存它。

班级{#size = 0; get size(){返回此。#尺寸;设置大小(值){假设num = number(值); // don' t允许南和东西。 if(!号码。Isfinite(num)){这个。#size = 0;返回 ;这个。#size = num; }}

我们如何在键入键中键入此JavaScript代码?好吧,技术上我们不必在这里做任何特别的事情 - 打字可以看出这个没有显式类型,可以弄清楚大小是一个数字。

问题是大小允许您为其分配超过数字。我们可以通过说大小具有未知类型或在此代码段中的任何类似:

但那没有好的 - 未知的力量人们阅读大小要做一个类型的断言,任何都不会捕获任何错误。如果我们真的想要建模转换值的API,那么先前版本的类型迫使我们选择精确(使读取值更容易,并编写更难)并且是允许的(这使得写入值更容易,并更容易地读取)。

这就是为什么打字4.3允许您指定用于读取和写入属性的类型。

班级{#size = 0; get size():number {返回此。#尺寸;设置大小(值:字符串|编号|布尔值){假设num = number(值); // don' t允许南和东西。 if(!号码。Isfinite(num)){这个。#size = 0;返回 ;这个。#size = num; }}

在上面的示例中,我们的设置访问器采用更广泛的类型(字符串,布尔值和数字),但我们的获取访问器始终保证它将是一个数字。现在我们最终可以将其他类型分配给这些属性,没有错误!

让事情=新事物(); //将其他类型分配给`thing.size`作品!事物 。 size ="你好" ;事物 。 size = true;事物 。尺寸= 42; //读取“thing.size`总是产生一个数字!让mysize:号码=的东西。尺寸 ;

在考虑彼此相同的两个属性有两个属性时,打字签名只会使用“读取”类型(例如,上面的GET访问器上的类型)。直接编写到属性时,仅考虑“写入”类型。

请记住,这不是一个限于课程的模式。您可以在对象文字中编写带有不同类型的Getters和Setter。

函数makething():thing {让size = 0;返回{get size():number {return size; },设置大小(值:字符串|编号|布尔值){假设num = number(值); // don' t允许南和东西。 if(!号码。Isfinite(num)){size = 0;返回 ; }大小= num; }}}

实际上,我们已将语法添加到接口/对象类型以支持属性上的不同读/写入类型。

//现在有效!界面{get size():number set size(值:number | string | boolean); }

使用不同类型读取和编写属性的一个限制是读取属性的类型必须可分配给您正在编写的类型。换句话说,getter类型必须可分配给Setter。这可确保某些级别的一致性,以便属性始终为自己分配。

在JavaScript中扩展课程时,该语言使其超级容易(双关语)来覆盖方法 - 但不幸的是,您可以遇到一些错误。

class someComponent {show(){// ...} hide(){// ...} {// ...}} class specialedComponent扩展了SomeComponent {show(){// ...} hide(){// ...}}

专门的组合子类别一组分数,并覆盖显示和隐藏方法。如果有人决定用单一方法撕掉并将它们替换并替换它们,会发生什么?

class someComponent { - show(){ - // ... - } - hide(){ - // ... - } + setvisible(value:boolean){+ // ... +}} class specialedcomponent扩展了一组组合{ 显示隐藏() { // ... } }

不好了!我们的专业营养不良没有更新。现在它只是添加了这两个无用的展示和隐藏的方法,可能不会被称为。

这里的部分问题是用户无法清楚地清楚他们是否意味着添加新方法,或覆盖现有方法。这就是为什么打字4.3添加override关键字。

Class SpecialedComponent扩展了SomeComponent {override show(){// ...} override hide(){// ...}}

当用覆盖标记方法时,键盘将始终确保基类中存在具有相同名称的方法。

class someComponent {setvisible(value:boolean){// ...}}类专门普通符号扩展了someComponent {override show(){// ~~~~~~~~ //错误!这种方法可以' t'覆盖'因为它没有宣布在'单体组分和#39; // ...} // ......}

这是一个很大的改进,但如果您忘记在方法上写覆盖,则没有帮助 - 这是用户也可以遇到的大错误。

例如,您可能会意外地“践踏”一个在基本类中存在的方法,而不实现它。

Class Base {yeyhelpermethod(){// ...}}派生扩展基础{// oops!我们试图覆盖这里,//我们只需要编写本地辅助方法。 yeuhelpermethod(){// ...}}

这就是为什么打字4.3还提供了一个新的--noimplicodoverride标志。打开此选项后,除非您显式使用覆盖关键字,否则它将从超类中覆盖任何方法。在该最后一个示例中,打字签名将在--noimplicatoverride错误,并给我们一个线索,我们可能需要重命名我们的方法。

我们谨此感谢我们的社区在此处实现。这些物品的工作是在Wenlu Wang的拉拉请求中实施,尽管早期的拉请求仅由Paul Cody Johnston实现覆盖关键字作为方向和讨论的基础。我们欣慰我们对这些功能的时间来说。

在最近的版本中,TypeScript推出了一个新型构造:模板字符串类型。这些是通过连接构建新的字符串状类型的类型......

键入color ="红色" | "蓝色" ;类型数量="一个" | "两个" ;键入seussfish =`$ {数量|颜色}鱼类; //与//键入seussfish ="一条鱼" | "两条鱼" // | "红色鱼" | "蓝色鱼&#34 ;;

我们所做的第一个更改就在打字机将推断模板字符串类型时。当由字符串文字类型中上下文键入模板字符串时(即,当CyperScript看到我们将模板字符串传递给采用文字类型时)时,它将尝试为该表达式提供模板类型。

功能栏(s:string):`hello $ {string}`{//以前的错误,现在有效!返回“你好$ {s}`; }

声明s:string;声明函数f< T延伸弦> (x:t):t; //以前:string //现在:`hello - $ {string}`设x2 = f(`hello $ {s}`);

这里的第二个主要变更是TypeScript现在可以更好地相关,并在不同的模板字符串类型之间推断。

当以S2上的像字符串文字类型检查时,打字标注可以匹配字符串内容并弄清楚S2在第一个分配中与S1兼容;但是,一旦看到另一个模板字符串,它就会放弃。因此,S3到S1等分配只是不起作用。

TypeScript现在实际上是为了证明模板字符串的每个部分是否可以成功匹配。您现在可以混合和匹配具有不同替换的模板字符串,并且打字签字将做好弄清楚他们是否真的兼容。

声明Let S1:`$ {number} - $ {number} - $ {number}`;宣布让S2:`1-2-3`;声明让S3:“$ {number} -2-3`;声明Let S4:`1- $ {node} -3`;声明让S5:`1-2- $ {node }`;声明Let S6:`$ {number} -2- $ {number}`; //现在*所有这些*工作! S1 = S2; s1 = s3; S1 = S4; s1 = s5; S1 = S6;

在进行这项工作时,我们也肯定会增加更好的推理能力。您可以在操作中看到这些示例:

声明功能foo< v延长字符串> (arg:`* $ {v} *`):v;功能测试< T延伸弦> (s:string,n:number,b:boolean,t:t){let x1 = foo(" * hello *"); //#34;你好"让x2 = foo(" **你好**"); //#34; *你好*"让x3 = foo(`* $ {s} *`为const); //字符串让x4 = foo(`* $ {n} *`为const); //` $ {number}`设x5 = foo(`* $ {b} *`为const); //#34;真" | "假"让x6 = foo(`* $ {t} *`为const); //` $ {t}`设x7 = foo(`** $ {s} **`为const); //` * $ {string} *`}

TypeScript 4.3展开了可以给出类中的哪个元素#private #names,使其在运行时真正私有。除属性外,还可以给出私有名称的方法和访问器。

class foo {#somemethod(){// ...} get#somevalue(){return 100; publicmethod(){//这些工作。 //我们可以访问此类中的私有名为成员。这个。#somemethod();返回这个。#somevalue; new foo()。#somemethod(); // ~~~~~~~~~~~ //错误! //属性'#somemethod'不可访问//外部类' foo'因为它具有私有标识符。新foo()。#somevalue; // ~~~~~~~~~~ //错误! //属性'#somevalue'不可访问//外部类' foo'因为它具有私有标识符。

class foo {static#somemethod(){// ...}} foo。#somemethod(); // ~~~~~~~~~~~ //错误! //属性'#somemethod'不可访问//外部类' foo'因为它具有私有标识符。

此功能均撰写于彭博(Bloomberg)的朋友的提取请求 - 由Titian Cernicova-Dragomirand Kubilay Kahveci撰写,提供Joey Watts,Rob Palmer和Tim McClure的支持和专业知识。我们谨此感谢所有人!

在StrickNullChecks下,检查有条件中的承诺是否是“真的”将触发错误。

异步函数foo():promise<布尔> {返回false; }异步函数栏():promise<字符串> {if(foo()){// ~~~~~ //错误! //这种情况总是返回truit以来//这个' promise< boolean>'似乎始终定义。 //你忘了使用'等待&#39 ;?返回"真实" ; }返回"假" ; }

索引签名允许我们在比明确声明的类型上设置更多属性。

班级foo {hello ="你好" ;世界= 1234; //这是一个索引签名:[propname:string]:String |号码|不明确的 ; lever insioft = new foo(); //有效的挖掘实例["无论如何" ] = 42; //有类型' string |号码| undefined'让x =实例["某事" ];

到目前为止,索引签名只能在类的实例侧声明。由于来自Wenlu Wang的拉拔请求,现在可以将索引签名声明为静态。

Class Foo {静态Hello ="你好" ;静态世界= 1234;静态[propname:string]:String |号码|不明确的 ; } // 有效的。 foo ["无论如何" ] = 42; //有类型' string |号码| undefined'让x = foo ["某事" ];

相同类型的规则适用于类的静态侧面上的索引签名,因为它们为实例侧面执行了 - 即,每个其他静态属性都必须与索引签名兼容。

类foo {静态prop = true; // ~~~~ //错误!物业' prop'类型'布尔' //未分配给字符串索引类型///#39;字符串|号码| undefined'静态[propname:string]:String |号码|不明确的 ; }

在JavaScript中使用导入和导出语句遇到的最大痛苦点之一是订单 - 特别是导入是写入的

当从头开始写出完整的导入语句时,这会导致一些疼痛,因为自动完成无法正常工作。例如,如果您开始编写导入{,打字签名不知道您正在计划导入哪些模块,因此它无法提供任何击尾完成。

为了减轻这一点,我们利用自动进口的力量!自动导入已经处理了无法从特定模块缩小完成的问题 - 他们的整个点是提供各种可能的导出,并自动在文件顶部插入导入语句。

因此,当您现在开始编写没有路径的导入语句时,我们将为您提供可能导入的列表。完成完成后,我们将完成完整的导入语句,包括您要写的路径。

这项工作要求专门支持该功能的编辑器。您将能够使用最新的Insiders版本的Visual Studio代码来试用这一点。

TypeScript现在可以了解@Link标签,并尝试解决链接到的声明。这意味着你可以在@Link标签中悬停在@Link标签中的名称上,并获取快速信息,或使用像Go-to定义或查找所有引用的命令。

例如,您可以在下面的示例中在@Link栏中的BAR上的定义,并跳转到栏的函数声明。

与每个类型的版本版本一样,lib.d.ts的声明(尤其是Web上下文生成的声明)已更改。在此版本中,我们利用Mozilla的浏览器 - 兼容数据来删除没有浏览器实现的API。它与之不同您正在使用它们,如帐户,断言,rtcstatsevent,msporefentvent,deviceLightevent,mspointerevent,serviceworkermessevent和webauthentication的API,都已从lib.ts中删除。这是在这里的一些细节中讨论的。

在StrickNullChecks下,使用始终似乎在条件检查中定义的承诺现在被视为错误。

声明var p:promise<号码> ; if(p){//〜//错误! //这种情况总是返回true以来// this' promise< number>'似乎始终定义。 // //你忘了使用'等待&#39 ;? }

当他们的成员自动填写或琐碎地写入时,某些枚举被认为是Union枚举。在这些情况下,枚举可以调用它可能代表的每个值。

在键盘4.3中,如果将具有Union枚举类型的值与数字文字相比,它永远不会等于,则Type-Checker将发出错误。

enum e {a = 0,b = 1,}函数dosomething(x:e){//错误!这种情况总是返回'假'自从类型' E'和#39; -1'没有重叠。 if(x === - 1){// ...}}

enum e {a = 0,b = 1,} //在类型中包含-1,如果我们'重新确认-1可以通过。功能dosomething(x:e | - 1){if(x === - 1){// ...}}

enum e {a = 0,b = 1,}函数dosomething(x:e){//使用&#39的类型asertion; x'因为我们知道我们'重复实际上只是处理来自' E' if((x as number)=== - 1){// ...}}

或者,您可以重新声明您的枚举具有非普通初始化程序,以便任何数字都分配和与该枚举相媲美。如果意图是枚举指定少数名众所周知的值,则这可能是有用的。

Enum E {//前导+ ON 0选择推断出Union枚举的类型。 a = + 0,b = 1,}

您可以通过检查TypeScript 4.3迭代计划来跟踪即将发布的候选人和稳定版本。 我们希望在这个测试版(或者更好,我们的夜间版本)获得反馈,所以今天给它一个拍摄!