成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

TypeScript 5.6 beta 發布:更完善的空值與真值檢查、Iterator Helpers、支持禁用類型檢查

開發 前端
為了解決這個問題,TypeScript 引入了 --noUncheckedSideEffectImports 配置,在啟用此配置時,TS 會檢查所有的副作用導入是否有效。

TypeScript 已于 2024.7.27 發布 5.6 beta 版本,你可以在 5.6 Iteration Plan 查看所有被包含的 Issue 與 PR。如果想要搶先體驗新特性,執行:

$ npm install typescript@beta

來安裝 beta 版本的 TypeScript,或在 VS Code 中安裝 JavaScript and TypeScript Nightly ,并選擇為項目使用 VS Code 的 TypeScript 版本(cmd + shift + p, 輸入 select typescript version),來更新內置的 TypeScript 支持。

圖片圖片

本篇是筆者的第 12 篇 TypeScript 更新日志,上一篇是 「TypeScript 5.5 beta 發布:類型守衛推導、控制流分析優化、獨立類型聲明等」,你可以在此賬號的創作中找到(或在掘金/知乎/Twitter搜索林不渡),接下來筆者也將持續更新 TypeScript 的 DevBlog 相關,感謝你的閱讀。

更完善的空值與真值檢查

TS 在 4.8 版本與 4.9 版本分別引入了「引用類型字面量值全等比較」與「NaN 相等檢查」的功能,用于檢查出代碼中的疏漏:

const obj = {};

// Error: 此語句始終將返回 false,因為 JavaScript 中使用引用地址比較對象,而非實際值
if (obj === {}) {
}

const func = () => {};
// Error: 此表達式將始終返回 true,你是否想要調用 func ?
if(func) { }

// 此表達式將始終返回 false,你是否指 Number.isNaN(value) ?
if(value === NaN) {}

而在 5.6 版本,TS 繼續完善了對這一類「可疑代碼」的檢查,現在能夠在發現表達式計算結果始終為 TRUE 時拋出錯誤,如正則表達式,函數表達式等:

if (/0x[0-9a-f]/) {
  // Error: 此表達式將始終返回 true
  // ...
}

if (x => 0) {
  // Error: 此表達式將始終返回 true
  // ...
}

同時在 5.6 版本也進一步完善了對空值合并(??)語法的檢查,有時候我們可能會粗心寫出如下的代碼:

const value = inital < input ?? 100;

我們的本意是為 input 應用默認值,但由于少了括號的分割,導致先進行左側的比較后再嘗試應用默認值。但我們知道,不同于 || 語法會在操作符左側是 '' 、 0 、false等“空值”時也應用默認值,?? 一定會確保左側是 null / undefined 才進行默認值引用,所以這里實際上永遠也不會應用默認值(雖然應用順序也不對就是了)。

現在,TypeScript 會檢查出這種情況并給出警告:

// Error: ?? 操作符的右側無法到達,因為操作符左側永遠不會是 null/undefined
const value = inital < input ?? 100;

需要注意的是,直接使用 true / false 這樣的值仍然是允許的,因為這通常是有意為之:

while (true) {
    doStuff();

    if (something()) {
        break;
    }

    doOtherStuff();
}

如果你熟悉 ESLint,應該會想到 no-constant-binary-expression 這條規則,它們的效果基本是一致的。

迭代器幫助方法 Iterator Helper

此特性是對 TC39 提案 proposal-iterator-helpers 的同步,其為 JavaScript 內置的迭代器對象(Iterator)增加了一組接口用于降低其使用成本,除 map、filter、some 這些與數組上方法功能類似的接口外,還包括一部分特有的方法:

  • iterator.take(limit: number),限定迭代器能夠產生有效值的次數,超過有效次數的 next 方法調用會返回 { value: undefined, done: true },即視為迭代結束。
function* naturals() {
    let i = 0;
    while (true) {
      yield i;
      i += 1;
    }
  }
  
  const result = naturals()
    .take(3);
  result.next(); //  {value: 0, done: false};
  result.next(); //  {value: 1, done: false};
  result.next(); //  {value: 2, done: false};
  result.next(); //  {value: undefined, done: true};
  • iterator.drop(limit: number),跳過迭代器的前數個值。
function* naturals() {
    let i = 0;
    while (true) {
      yield i;
      i += 1;
    }
  }
  
  const result = naturals()
    .drop(3);
  result.next(); //  {value: 3, done: false};
  result.next(); //  {value: 4, done: false};
  result.next(); //  {value: 5, done: false};
  • iterator.flatMap(mapper),類似于 RxJs 中的 flatMap 操作符,mapper 方法會再次返回一個 Iterator ,可以用來將多個 Iterator 合成一個,類似于 RxJs 中合并多個 Observable。
function* naturals() {
    let i = 0;
    while (true) {
      yield i;
      i += 1;
    }
  }
  
  const result = naturals()
    .drop(3);
  result.next(); //  {value: 3, done: false};
  result.next(); //  {value: 4, done: false};
  result.next(); //  {value: 5, done: false};
  • iterator.toArray(),用于將有限迭代器轉換為數組。
function* naturals() {
    let i = 0;
    while (true) {
      yield i;
      i += 1;
    }
  }
  
  const result = naturals()
    .take(5)
    .toArray();
  
  result // [0, 1, 2, 3, 4]
  • Iterator.from(),用于從部署了 next 方法的對象結構生成一個標準迭代器,有點類似于 Array.from 方法。
class Iter {
    next() {
      return { done: false, value: 1 };
    }
  }
  
  const iter = new Iter();
  const wrapper = Iterator.from(iter);
  
  wrapper.next() // { value: 1, done: false }

這些方法明顯受到了 RxJs 與 Ix 的影響,畢竟 Iterator 和 Observable 在許多方面是非常相似的。由于這些方法并不會在每個運行時中都支持,同時為了避免和已有的 Iterator 命名沖突,TypeScript 中引入了一個新的類型 BuiltinIterator 來部署這些接口。

支持任意模塊標識符 Arbitrary Module Identifiers

TypeScript 現在允許使用任意的標識符名(Arbitrary Module Identifiers)稱來定義模塊的導出綁定:

// fruits.ts
const banana = "??";

export { banana as "??" };

// index.ts
import * as Fruits from './fruits';

Fruits['??'];

這一功能看起來很搞笑,但實際上,它在 ES2022 就已經得到支持,反而是 TypeScript 慢了一步。這一功能在 WASM 等場景下是有實用意義的:

import { "Foo::new" as Foo_new } from "./foo.wasm"

const foo = Foo_new()

export { Foo_new as "Foo::new" }

另外,這一功能是由 ESBuild 的作者實現的,參考 #58640。

使用 --noUncheckedSideEffectImports 檢查副作用導入

JavaScript 中我們是可以直接導入一個文件而不指定導入值的,比如:

import '@inside/polyfills'
import './polyfills'

這種導入一般稱為副作用導入,比如導入 Polyfills,導入 CSS/Less 文件等。但是在 TypeScript 中,副作用導入的行為會略顯奇怪。如果這個導入路徑是確實存在的,TypeScript 會加載并檢查來自導入的類型,但是如果導入路徑不存在,TypeScript 會直接忽略這條導入語句而不是拋出錯誤,所以大概率你要到 Bundler 層或者運行時才會發現這個問題。

為了解決這個問題,TypeScript 引入了 --noUncheckedSideEffectImports 配置,在啟用此配置時,TS 會檢查所有的副作用導入是否有效。

使用 --noCheck 跳過類型檢查

TypeScript 5.6 引入了 --noCheck 配置來支持禁用所有的類型檢查——需要注意的是,此配置并不意味著不會生成聲明文件(你是否在找 --noEmit ),引入其的目的之一就是配合 --isolatedDeclarations 配置,在不進行類型檢查的前提下快速生成聲明文件。或者你也可以獨立使用 tsc --noEmit 與 tsc --noCheck 來拆分構建階段,前者負責類型檢查,后者負責生成產物。

在這里稍微展開介紹一下幾個相關配置:

  • noEmit,進行類型檢查,不生成類型聲明與編譯產物
  • noCheck,不進行類型檢查,生成類型聲明與編譯產物
  • declaration,生成類型聲明,注意這個配置默認可是 false (若啟用了 Project References,則是 true)
  • emitDeclarationOnly,僅生成類型聲明,不生成編譯產物
責任編輯:武曉燕 來源: 林不渡也不是不能渡
相關推薦

2024-09-10 09:03:54

微軟TypeScript

2021-06-09 07:55:19

Typescript類型檢查

2023-01-05 08:09:27

GroovyDSL?

2021-06-05 21:30:24

typescriptOverride檢查

2013-07-09 14:41:58

C動態類型

2010-03-12 19:03:48

Python 拼寫檢查

2014-01-09 10:40:38

Cocos3.0 Be觸控

2023-01-06 08:06:52

Groovy類型擴展

2022-05-30 10:18:41

Ubuntu物聯網

2009-08-18 09:32:21

Silverlight

2021-03-09 16:03:02

微軟Microsoft漏洞

2009-04-03 15:07:14

Debian HCL硬件驅動Linux

2022-12-30 08:08:30

2012-04-19 09:50:53

Chrome 19Be新版發布

2011-03-23 16:00:43

紅帽企業級LinuxRHEL 6

2009-12-07 16:16:45

Windows 7磁盤檢查

2020-08-19 08:29:22

JavaScript 對象函數

2024-05-11 10:19:31

TypeScript類型接口

2024-04-12 12:36:06

JSJavaScrip方式

2012-07-02 10:43:49

JVMGroovyJava
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲va欧美va人人爽午夜 | 精品无码久久久久久久动漫 | 亚洲+变态+欧美+另类+精品 | 久久国产精品网 | 欧美理论 | 超碰综合| 日韩精品 电影一区 亚洲 | 国产精品久久久精品 | 91天堂网 | 天堂一区 | 日韩精品免费在线观看 | 国产成人艳妇aa视频在线 | 黄色男女网站 | 成人在线视频一区二区三区 | 久久国产香蕉 | 欧美激情精品久久久久久 | 免费h在线| 成人永久免费 | 亚洲精品成人 | 婷婷五月色综合 | 欧美精品一区在线 | 国产精品国产三级国产aⅴ中文 | 91av在线影院 | 国产精品影视在线观看 | 久久成人一区 | 国产精品亚洲精品 | 天天草草草 | 国产一区三区在线 | 亚洲一区二区三区免费 | 日韩欧美国产精品一区二区三区 | 在线观看免费av网 | 婷婷国产一区 | 欧美日韩中文字幕 | 91欧美精品成人综合在线观看 | 国产精品一区二区日韩 | 欧美日韩一区二区三区四区 | 涩涩视频网 | 粉嫩av久久一区二区三区 | 香蕉一区| 久草视频在线播放 | 宅男伊人|