自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

15個(gè)Typescript 5.0 中重要的新功能快速了解一下

開(kāi)發(fā) 前端
作為一種在開(kāi)發(fā)人員中越來(lái)越受歡迎的編程語(yǔ)言,TypeScript 不斷發(fā)展,帶來(lái)了大量的改進(jìn)和新功能。在本文中,我們將深入研究 TypeScript 的最新迭代版本 5.0,并探索其最值得注意的更新。

作為一種在開(kāi)發(fā)人員中越來(lái)越受歡迎的編程語(yǔ)言,TypeScript 不斷發(fā)展,帶來(lái)了大量的改進(jìn)和新功能。在本文中,我們將深入研究 TypeScript 的最新迭代版本 5.0,并探索其最值得注意的更新。

1.裝飾器

TypeScript 5.0 引入了改進(jìn)的裝飾器系統(tǒng),改進(jìn)了類(lèi)型檢查和元數(shù)據(jù)生成。 裝飾器現(xiàn)在可以更無(wú)縫地與類(lèi)型系統(tǒng)一起工作,使您能夠編寫(xiě)更清晰、更健壯的代碼。下面是方法裝飾器如何工作的一個(gè)簡(jiǎn)單示例:

function log<This, Args extends any[], Return>(
target: (this: This, ...args: Args) => Return,
context: ClassMethodDecoratorContext<
This,
(this: This, ...args: Args) => Return
>
) {
const methodName = String(context.name);


function replacementMethod(this: This, ...args: Args): Return {
console.log(`LOG: Entering method '${methodName}'.`);
const result = target.call(this, ...args);
console.log(`LOG: Exiting method '${methodName}'.`);
return result;
}


return replacementMethod;
}


class Calculator {
@log
add(a: number, b: number): number {
return a + b;
}
}


const calculator = new Calculator();
console.log(calculator.add(2, 3));
// "LOG: Entering method 'add'."
// "LOG: Exiting method 'add'."
// 5

在此示例中,@log 裝飾器會(huì)在每次調(diào)用方法時(shí)記錄方法名稱(chēng)。除了方法裝飾器,TypeScript 5.0 還支持自動(dòng)訪問(wèn)器裝飾器、Getter 和 Setter 裝飾器等。

2. const 類(lèi)型參數(shù)

在 TypeScript 5.0 之前,其推理通常會(huì)選擇更通用的類(lèi)型,例如 將 ["Alice", "Bob", "Eve"] 推斷為 string[],如果您想要更具體的類(lèi)型,則必須為其添加 as const:

// string[]
const a = ["Alice", "Bob", "Eve"]


// readonly ["Alice", "Bob", "Eve"]
const b = ["Alice", "Bob", "Eve"] as const

TypeScript 5.0 允許您將 const 修飾符添加到類(lèi)型參數(shù)聲明中:

declare function fnGood<const T extends readonly string[]>(args: T): void;


// T is readonly ["a", "b", "c"]
fnGood(["a", "b" ,"c"]);

但請(qǐng)記住,const 修飾符僅影響在調(diào)用中編寫(xiě)的對(duì)象、數(shù)組和原始表達(dá)式的推斷,因此不會(huì)(或不能)用 as const 修改的參數(shù)將看不到任何 行為改變:

declare function fnGood<const T extends readonly string[]>(args: T): void;
const arr = ["a", "b" ,"c"];


// 'T' is still 'string[]'-- the 'const' modifier has no effect here
fnGood(arr);

3. extends支持多配置文件

TypeScript 5.0 帶來(lái)了在 tsconfig.json 中擴(kuò)展多個(gè)配置文件的能力。此功能使跨項(xiàng)目共享和管理配置變得更加容易。以下是如何使用多個(gè)配置文件的示例:

{
"extends": ["./config/base", "./config/jest"],
"compilerOptions": {
"target": "esnext",
"module": "commonjs",
"strict": true
}
}

在此示例中,配置文件擴(kuò)展了基本配置和玩笑配置,允許您根據(jù)需要組合和覆蓋設(shè)置。

4. 所有枚舉都是聯(lián)合枚舉

在 TypeScript 5.0 中,所有枚舉現(xiàn)在都被視為聯(lián)合枚舉。 聯(lián)合枚舉為使用枚舉值提供了更好的類(lèi)型安全性和改進(jìn)的人體工程學(xué)。 這是一個(gè)例子:

enum E {
A = 10 * 10, // Numeric literal enum member
B = 'foo', // String literal enum member
C = Math.random(), // Opaque computed enum member
}


function getStringValue(e: E): string {
return String(e);
}


const val = getStringValue(E.A); // "100"

TypeScript 5.0 通過(guò)為每個(gè)計(jì)算成員創(chuàng)建唯一類(lèi)型,設(shè)法將所有枚舉變成聯(lián)合枚舉。這意味著現(xiàn)在可以縮小所有枚舉的范圍,并將其成員也作為類(lèi)型引用。

5. — moduleResolution 捆綁器

TypeScript 5.0 引入了一種新的模塊解析策略,稱(chēng)為 bundler。此策略旨在與 Webpack 和 Rollup 等捆綁器一起使用,從而實(shí)現(xiàn)更高效和簡(jiǎn)化的構(gòu)建過(guò)程(就像過(guò)去 Node.js 模塊中的任何相關(guān)導(dǎo)入一樣,需要包含文件擴(kuò)展名)。

要啟用 bundler 模塊解析策略,請(qǐng)?jiān)?tsconfig.json 中使用以下配置:

{
"compilerOptions": {
"moduleResolution": "bundler"
}
}

6.自定義分辨率標(biāo)志

TypeScript 5.0 添加了幾個(gè)新標(biāo)志來(lái)自定義模塊解析過(guò)程。這些標(biāo)志對(duì)如何解析模塊提供了更精細(xì)的控制,使您可以微調(diào)構(gòu)建過(guò)程。 

以下是簡(jiǎn)要概述:

  • --allowImportingTsExtensions:允許導(dǎo)入帶有 TypeScript 特定擴(kuò)展名的 TypeScript 文件,例如 .ts、.mts 或 .tsx。
  • --resolvePackageJsonExports:強(qiáng)制 TypeScript 在從 node_modules 中讀取包時(shí)查詢(xún) package.json 文件的導(dǎo)出字段。
  • --resolvePackageJsonImports:強(qiáng)制 TypeScript 在執(zhí)行以 # 開(kāi)頭的查找時(shí)查詢(xún) package.json 文件的導(dǎo)入字段。
  • --allowArbitraryExtensions:允許通過(guò)查找 {file basename}.d.{extension}.ts 形式的聲明文件來(lái)導(dǎo)入具有未知擴(kuò)展名的文件。
  • --customConditions:獲取當(dāng) TypeScript 從 package.json 的導(dǎo)出或?qū)胱侄谓馕鰰r(shí)要考慮的附加條件列表。

7. — verbatimModuleSyntax

TypeScript 5.0 中新的 --verbatimModuleSyntax 標(biāo)志允許您在發(fā)出 JavaScript 代碼時(shí)保留原始模塊語(yǔ)法。 此功能在使用捆綁器時(shí)特別有用,因?yàn)樗恍枰~外的轉(zhuǎn)換。例如:

// Erased away entirely.
import type { A } from "a";


// Rewritten to 'import { b } from "bcd";'
import { b, type c, type d } from "bcd";


// Rewritten to 'import {} from "xyz";'
import { type xyz } from "xyz";

要啟用此標(biāo)志,請(qǐng)將其添加到您的 tsconfig.json 中:

{
"compilerOptions": {
"verbatimModuleSyntax": true
}
}

8.支持 export type*

TypeScript 5.0 引入了對(duì) export type * 語(yǔ)法的支持,它允許您從另一個(gè)模塊重新導(dǎo)出所有類(lèi)型。 

此語(yǔ)法對(duì)于創(chuàng)建僅類(lèi)型模塊或聚合來(lái)自多個(gè)來(lái)源的類(lèi)型特別有用。 

這是一個(gè)例子:

// types.ts
export type { Foo } from './foo';
export type { Bar } from './bar';


// index.ts
export type * from './types';
// Also support
export type * as Types from './types';

在此示例中,使用 export type * 語(yǔ)法將 types.ts 模塊中的所有類(lèi)型重新導(dǎo)出到 index.ts 模塊中。

9. JSDoc 中的@satisfies 支持

TypeScript 5.0 中新的@satisfies JSDoc 標(biāo)記使您能夠指定函數(shù)實(shí)現(xiàn)滿足特定接口。 在使用結(jié)構(gòu)類(lèi)型或使用 TypeScript 對(duì) JavaScript 代碼進(jìn)行類(lèi)型檢查時(shí),此功能特別有用。 

這是一個(gè)例子:

// interface Greeter {
// greet(name: string): number;
// }


/**
* @typedef {Function} Greeter
* @param {string} name
* @returns {string}
*/


/**
* @satisfies {Greeter}
*/
function greeter(name: string) {
return `Hello, ${name}!`;
}

在這個(gè)例子中,greeter 函數(shù)被標(biāo)記為@satisfies JSDoc 標(biāo)簽,表明它滿足 Greeter 接口。

10. JSDoc 中的@overload 支持

TypeScript 5.0 添加了對(duì) @overload JSDoc 標(biāo)記的支持,允許您在 JavaScript 代碼中為單個(gè)實(shí)現(xiàn)定義多個(gè)函數(shù)簽名。 

在處理需要支持多種參數(shù)類(lèi)型或形狀的復(fù)雜函數(shù)時(shí),此功能特別有用。 

這是一個(gè)例子:

/**
* @overload
* @param {string} a
* @param {string} b
* @return {string}
*/


/**
* @overload
* @param {number} a
* @param {number} b
* @return {number}
*/


/**
* @param {string | number} a
* @param {string | number} b
*/
export function add(a, b) {
if (typeof a === 'number' && typeof b === 'number') {
return a + b;
} else if (typeof a === 'string' && typeof b === 'string') {
return a.concat(b);
}
}


const numResult = add(1, 2); // 3
const strResult = add('hello', 'world'); // "helloworld"
const errResult = add('hello', 123); // Error: No overload matches this call.

在此示例中,add 函數(shù)標(biāo)有兩個(gè) @overload JSDoc 標(biāo)記,指定它可以處理數(shù)字和字符串作為參數(shù)。

11. 在 — build 下傳遞特定于發(fā)射的標(biāo)志

TypeScript 5.0 引入了在使用 --build 標(biāo)志時(shí)傳遞 emit-specific 標(biāo)志的能力。此功能允許您在構(gòu)建項(xiàng)目時(shí)微調(diào)項(xiàng)目的輸出,從而更好地控制構(gòu)建過(guò)程。部分消息:

  • --declaration:從項(xiàng)目中的 TypeScript 和 JavaScript 文件生成 .d.ts 文件。
  • --emitDeclarationOnly:只輸出 d.ts 文件,不輸出 JavaScript 文件。
  • --declarationMap:為 d.ts 文件創(chuàng)建 sourcemaps。
  • --sourceMap:為發(fā)出的 JavaScript 文件創(chuàng)建源映射文件。
  • --inlineSourceMap:在發(fā)出的 JavaScript 中包含源映射文件。

12. 編輯器中不區(qū)分大小寫(xiě)的導(dǎo)入排序

TypeScript 5.0 通過(guò)不區(qū)分大小寫(xiě)改進(jìn)了編輯器中的導(dǎo)入排序。在組織導(dǎo)入時(shí),此更改會(huì)導(dǎo)致更自然和直觀的排序順序,從而使代碼更清晰、更易讀。

13. 詳盡的開(kāi)關(guān)/外殼完成

TypeScript 5.0 通過(guò)提供詳盡的 switch/case 補(bǔ)全增強(qiáng)了代碼補(bǔ)全體驗(yàn)。 在處理聯(lián)合類(lèi)型時(shí),編輯器現(xiàn)在可以建議所有可能的情況,減少遺漏情況的機(jī)會(huì),并使編寫(xiě)全面的 switch 語(yǔ)句變得更加容易。 這是一個(gè)例子:

type Animal = "cat" | "dog" | "fish";


function speak(animal: Animal): string {
switch (animal) {
// TypeScript 5.0 will suggest all possible cases: "cat", "dog", "fish"
}
}

14. 速度、內(nèi)存和包大小優(yōu)化

TypeScript 5.0 帶來(lái)了各種性能優(yōu)化,包括更快的類(lèi)型檢查、更少的內(nèi)存使用和更小的包大小。這些改進(jìn)使使用 TypeScript 變得更加愉快,確保了流暢高效的開(kāi)發(fā)體驗(yàn)。

15.重大變更和棄用

與任何主要版本一樣,TypeScript 5.0 引入了一些重大更改和棄用。 在升級(jí)之前查看發(fā)行說(shuō)明并徹底測(cè)試您的項(xiàng)目至關(guān)重要。 

一些顯著的重大變化包括:

  • 運(yùn)行時(shí)要求:TypeScript 現(xiàn)在以 ECMAScript 2018 為目標(biāo)。TypeScript 包還設(shè)置了最低預(yù)期引擎 12.20。對(duì)于 Node 用戶(hù),這意味著 TypeScript 5.0 的最低版本要求至少為 Node.js 12.20 及更高版本。
  • lib.d.ts 更改:更改 DOM 類(lèi)型的生成方式可能會(huì)對(duì)現(xiàn)有代碼產(chǎn)生影響。值得注意的是,某些屬性已從數(shù)字轉(zhuǎn)換為數(shù)字文字類(lèi)型,并且用于剪切、復(fù)制和粘貼事件處理的屬性和方法已跨接口移動(dòng)。
  • API 重大更改:移至模塊,刪除了一些不必要的接口并進(jìn)行了一些正確性改進(jìn)。
  • 關(guān)系運(yùn)算符中禁止的隱式強(qiáng)制轉(zhuǎn)換:
function func1(ns: number | string) {
return ns * 4; // Error, possible implicit coercion
}


function func2(ns: number | string) {
return ns > 4; // Error, possible implicit coercion
}


function func3(ns: number | string) {
return +ns > 4; // OK
}
  • Enum Overhaul:在 TypeScript 5.0 中你不會(huì)看到那些奇怪的 enum 問(wèn)題,這里有兩個(gè)重要的錯(cuò)誤改進(jìn):
// Part1: Assigning an out-of-domain literal to an enum type 
// now errors out as one would expect.
enum SomeEvenDigit {
Zero = 0,
Two = 2,
Four = 4,
}


// Now correctly an error
let m: SomeEvenDigit = 1;


// Part2: Enums declaring values with mixed numeric and
// indirect string enum references incorrectly create an all-numeric enum.
enum Letters {
A = 'a',
}
enum Numbers {
one = 1,
two = Letters.A,
}


// Now correctly an error
const t: number = Numbers.two;

對(duì)構(gòu)造函數(shù)中的參數(shù)裝飾器進(jìn)行更準(zhǔn)確的類(lèi)型檢查 — experimentalDecorators

一些已棄用的配置和配置值。

結(jié)論

總之,TypeScript 5.0 帶來(lái)了許多新功能,那么,您覺(jué)得哪個(gè)功能最有用?

責(zé)任編輯:華軒 來(lái)源: web前端開(kāi)發(fā)
相關(guān)推薦

2020-05-11 15:01:16

JavaJKD 15工具

2020-02-10 14:26:10

GitHub代碼倉(cāng)庫(kù)

2020-12-01 17:46:24

FossilGit

2020-12-10 08:44:35

WebSocket輪詢(xún)Comet

2011-07-27 14:41:59

Oracle ERP

2022-03-24 13:36:18

Java悲觀鎖樂(lè)觀鎖

2019-06-24 09:57:39

網(wǎng)絡(luò)工具調(diào)試

2020-03-01 17:53:38

Excel大數(shù)據(jù)微軟

2020-09-22 07:33:03

開(kāi)發(fā)技能代碼

2020-09-26 22:20:52

ML自動(dòng)機(jī)器學(xué)習(xí)深度學(xué)習(xí)

2011-03-01 14:08:51

Fedora 15

2022-09-14 15:11:06

Linux防火墻

2019-02-20 14:16:43

2014-10-30 14:42:57

Android 5.0Google

2018-06-05 17:40:36

人工智能語(yǔ)音識(shí)別

2024-04-11 12:19:01

Rust數(shù)據(jù)類(lèi)型

2023-04-10 06:59:17

Linux桌面環(huán)境

2018-07-19 11:49:54

搜狗

2018-04-25 06:46:52

2012-03-20 09:25:29

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)