国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

TypeScript 4.0正式發(fā)布!現(xiàn)在是開始使用它的最佳時(shí)機(jī)

共 9063字,需瀏覽 19分鐘

 ·

2020-09-07 02:39


作者 | Daniel Rosenwasser?譯者 | 王強(qiáng)?策劃 | 李俊辰
今天,微軟宣布 TypeScript 4.0 正式版上線了!這一新版本深入改進(jìn)了表現(xiàn)力、生產(chǎn)力和可伸縮性,是 TypeScript 語言的新一代版本。

如果你還不熟悉 TypeScript,這里簡(jiǎn)單介紹一下:它是一種在 JavaScript 之上通過添加靜態(tài)類型語法來構(gòu)建的語言。它的基本理念是,記下值的類型以及它們的使用位置后,可以使用 TypeScript 對(duì)代碼進(jìn)行類型檢查,并在運(yùn)行代碼之前(甚至在保存文件之前)告訴你代碼錯(cuò)誤的相關(guān)信息。然后,你可以使用 TypeScript 編譯器從代碼中剝離類型,并為你提供可在任何地方運(yùn)行的簡(jiǎn)潔易讀的 JavaScript 代碼。除了類型檢查之外,TypeScript 還使用靜態(tài)類型來支持強(qiáng)大的編輯器工具,例如自動(dòng)完成、代碼導(dǎo)航、重構(gòu)等。實(shí)際上,如果你在 Visual Studio Code 或 Visual Studio 這樣的編輯器中使用過 JavaScript,那么你已經(jīng)用上了類型和 TypeScript 帶來的體驗(yàn)。可以在我們的網(wǎng)站上了解更多相關(guān)信息。

https://www.typescriptlang.org/

TypeScript 4.0 沒有引入特別重大的更改。實(shí)際上,如果你剛剛開始接觸這種語言,那么現(xiàn)在是開始使用它的最佳時(shí)機(jī)。它的社區(qū)已經(jīng)成熟完善,并在不斷發(fā)展,擁有可運(yùn)行的代碼和很棒的新資源可供學(xué)習(xí)。還有一件事情:盡管我們?yōu)?4.0 引入了那么多好東西,但你實(shí)際上只需要了解 TypeScript 的基礎(chǔ)知識(shí)就可以開始生產(chǎn)應(yīng)用了!

如果你已經(jīng)在項(xiàng)目中使用 TypeScript,則可以通過 NuGet 獲取它,也可以通過以下命令使用 npm 獲?。?br mpa-from-tpl="t">
npm install?-D typescript

你還可以通過以下方式獲得編輯器支持:

  • 下載 Visual Studio 2019/2017:

    • https://marketplace.visualstudio.com/items?itemName=TypeScriptTeam.TypeScript-40

  • 安裝 Visual Studio Code 的內(nèi)部版本,或按照以下說明使用較新版本的 TypeScript。

    • https://code.visualstudio.com/docs/typescript/typescript-compiling#_using-newer-typescript-versions

4.0 之旅?

TypeScript 是當(dāng)今許多人的 JavaScript 技術(shù)棧的核心部分。在 npm 上,TypeScript 在 7 月首次實(shí)現(xiàn)了超過 5000 萬的月下載量!盡管我們知道它總有增長(zhǎng)和改進(jìn)的余地,但很明顯,大多數(shù)使用 TypeScript 編碼的開發(fā)人員確實(shí)很喜歡它。StackOverflow 的最新開發(fā)人員調(diào)查將 TypeScript 列為第二受歡迎的語言。在最新的 JS 現(xiàn)狀調(diào)查中,使用 TypeScript 的開發(fā)人員中有大約 89% 表示會(huì)再次使用它。

值得一提的是我們走到今天所走過的旅程。在之前的兩個(gè)主要版本中,我們回顧了多年來閃耀的一些亮點(diǎn)。對(duì)于 TypeScript 4.0,我們將保持這種傳統(tǒng)。

從 3.0 版本向前看,可以看到許多令人眼花繚亂的更改,但是 TypeScript 3.0 本身就產(chǎn)生了很大的沖擊。統(tǒng)一元組類型和參數(shù)列表是當(dāng)時(shí)的一大亮點(diǎn),可在函數(shù)上啟用大量已有的 JavaScript 模式。這個(gè)發(fā)行版還提供了項(xiàng)目參考,以幫助擴(kuò)展、組織和共享代碼庫(kù)。3.0 版的一個(gè)產(chǎn)生重大影響的小更改是對(duì) any 引入了類型安全的替代方法,稱為 unknown。

TypeScript 3.1 擴(kuò)展了映射類型的功能以處理元組和數(shù)組類型,并極大簡(jiǎn)化了將屬性附加到函數(shù)的過程,而無需使用 TypeScript 專屬的運(yùn)行時(shí)功能(已停用)。

TypeScript 3.2 允許對(duì)象在泛型類型上傳播,并通過嚴(yán)格類型化 bind、call 和 apply,利用 3.0 的功能更好地建模函數(shù)的元編程。TypeScript 3.3 更多關(guān)注穩(wěn)定性,但也改進(jìn)了聯(lián)合類型方法,并在 --build 模式下添加了文件增量式構(gòu)建。

在 3.4 版本中,我們進(jìn)一步支持函數(shù)式模式,更好地支持不可變數(shù)據(jù)結(jié)構(gòu),并改進(jìn)了對(duì)高階泛型函數(shù)的推斷。這個(gè)發(fā)行版的一大改進(jìn)是引入了 --incremental 標(biāo)志,該方法避免了在每次 TypeScript 運(yùn)行時(shí)完全重建,從而加快了編譯和類型檢查的速度。

在 TypeScript 3.5 和 3.6 中加強(qiáng)了一些類型系統(tǒng)規(guī)則,還帶來了更智能的兼容性檢查規(guī)則。

TypeScript 3.7 是一個(gè)非常值得關(guān)注的版本,因?yàn)樗芎玫亟Y(jié)合了許多新的類型系統(tǒng)特性與 ECMAScript 特性。在類型系統(tǒng)方面,我們加入了遞歸類型別名引用和對(duì)斷言樣式函數(shù)的支持,這兩者都是獨(dú)特的類型系統(tǒng)特性。從 JavaScript 方面來看,該版本帶來了可選鏈和空值合并功能,這是 TypeScript 和 JavaScript 用戶最期待的兩項(xiàng)功能。

最近,3.8 和 3.9 帶來了僅類型的導(dǎo)入 / 導(dǎo)出,以及許多 ECMAScript 特性,例如私有字段、模塊中的頂級(jí) await 和新的 export* 語法。這些版本還帶來了性能和可伸縮性優(yōu)化。

我們還沒有提到關(guān)于語言服務(wù)、基礎(chǔ)架構(gòu)、網(wǎng)站和其他核心項(xiàng)目中的那些工作,這些工作對(duì)于 TypeScript 的體驗(yàn)非常關(guān)鍵。核心團(tuán)隊(duì)的項(xiàng)目之外,我們?cè)谏鷳B(tài)系統(tǒng)中還有非常出色的貢獻(xiàn)者社區(qū),他們推動(dòng)了體驗(yàn)的不斷改進(jìn),并通過 DefinitelyTyped 甚至 TypeScript 本身提供了幫助。在 2012 年剛開始時(shí),DefinitelyTyped 僅有 80 個(gè)拉取請(qǐng)求。在 2019 年,它有超過 8300 個(gè)拉取請(qǐng)求,非常震撼人心。這些貢獻(xiàn)是 TypeScript 體驗(yàn)的基礎(chǔ),這樣一個(gè)繁忙而熱情的社區(qū)在不斷改善我們的生態(tài)系統(tǒng),并推動(dòng)我們不斷改進(jìn),我們對(duì)此表示感謝。

可變?cè)M類型
考慮 JavaScript 中稱為 concat 的函數(shù),該函數(shù)接收兩個(gè)數(shù)組或元組類型,并將它們連接在一起以創(chuàng)建一個(gè)新數(shù)組。
function?concat(arr1, arr2)?{
????return?[...arr1, ...arr2];
}
考慮 tail,它接收一個(gè)數(shù)組或元組,并返回除第一個(gè)元素外的所有元素。
function?tail(arg)?{
????const?[_, ...result] = arg;
????return?result
}
我們?nèi)绾卧?TypeScript 中為它們類型化?對(duì)于 concat,我們?cè)谳^舊版本的 TS 中唯一可以做的就是嘗試編寫一些重載。
function?concat<>(arr1: [], arr2: []): [A];
function?concat<A>(arr1: [A], arr2: []): [A];
function?concat<A, B>(arr1: [A, B], arr2: []): [A, B];
function?concat<A, B, C>(arr1: [A, B, C], arr2: []): [A, B, C];
function?concat<A, B, C, D>(arr1: [A, B, C, D], arr2: []): [A, B, C, D];
function?concat<A, B, C, D, E>(arr1: [A, B, C, D, E], arr2: []): [A, B, C, D, E];
function?concat<A, B, C, D, E, F>(arr1: [A, B, C, D, E, F], arr2: []): [A, B, C, D, E, F];)
第二個(gè)數(shù)組始終為空時(shí)會(huì)冒出來七個(gè)重載。當(dāng) arr2 有一個(gè)參數(shù)時(shí)我們?cè)偌右恍┛纯础?br mpa-from-tpl="t">
function?concat<A2>(arr1: [], arr2: [A2]): [A2];
function?concat<A1, A2>(arr1: [A1], arr2: [A2]): [A1, A2];
function?concat<A1, B1, A2>(arr1: [A1, B1], arr2: [A2]): [A1, B1, A2];
function?concat<A1, B1, C1, A2>(arr1: [A1, B1, C1], arr2: [A2]): [A1, B1, C1, A2];
function?concat<A1, B1, C1, D1, A2>(arr1: [A1, B1, C1, D1], arr2: [A2]): [A1, B1, C1, D1, A2];
function?concat<A1, B1, C1, D1, E1, A2>(arr1: [A1, B1, C1, D1, E1], arr2: [A2]): [A1, B1, C1, D1, E1, A2];
function?concat<A1, B1, C1, D1, E1, F1, A2>(arr1: [A1, B1, C1, D1, E1, F1], arr2: [A2]): [A1, B1, C1, D1, E1, F1, A2];
很明顯這變得越來越離譜了。不幸的是,在類型化 tail 之類的函數(shù)時(shí),你也會(huì)遇到同樣的問題。下面是另一種情況,我們稱之為“被一千個(gè)重載搞垮”,它甚至什么問題都解決不了。它只為我們想寫的重載提供正確的類型(不管重載有多少)。如果我們想做一個(gè)通行模式,就需要下面這種重載:
function?concat<T, U>(arr1: T[], arr2, U[]): Array<T?| U>;

但在使用元組時(shí),這個(gè)簽名不會(huì)包含輸入長(zhǎng)度或元素順序的任何信息。TypeScript 4.0 帶來了兩個(gè)基礎(chǔ)更改,并在推斷方面進(jìn)行了改進(jìn),從而可以類型化這些內(nèi)容。

第一個(gè)更改是元組類型語法中的 spread 現(xiàn)在可以泛型。這意味著即使我們不知道要操作的實(shí)際類型,也可以表示對(duì)元組和數(shù)組的高階操作。在這些元組類型中實(shí)例化泛型 spread(或用真實(shí)類型替換)時(shí),它們可以產(chǎn)生其他數(shù)組和元組類型集。

例如,我們可以類型化 tail 那樣的函數(shù),而不會(huì)出現(xiàn)“被一千個(gè)重載搞垮”的問題。
function?tail<T?extends?any[]>(arr: readonly [any, ...T]) {
????const?[_ignored, ...rest] = arr;
????return?rest;
}
const?myTuple = [1, 2, 3, 4] as?const;
const?myArray = ["hello", "world"];
// type [2, 3, 4]
const?r1 = tail(myTuple);
// type [2, 3, ...string[]]
const?r2 = tail([...myTuple, ...myArray] as?const);
第二個(gè)更改是,rest 元素可以出現(xiàn)在元組中的任何位置,而不僅僅是在結(jié)尾!
type?Strings = [string, string];
type?Numbers = [number, number];
// [string, string, number, number]
type?StrStrNumNum = [...Strings, ...Numbers];
以前,TypeScript 會(huì)發(fā)出如下錯(cuò)誤。
A rest element must be?last?in a?tuple type.

但是現(xiàn)在這種限制取消了。

當(dāng)我們?cè)跊]有已知長(zhǎng)度的類型中 spread 時(shí),結(jié)果類型也將變得不受限制,并且后面的所有元素都會(huì)變?yōu)榻Y(jié)果的 rest 元素類型。
type?Strings = [string, string];
type?Numbers = number[]
// [string, string, ...Array]
type?Unbounded = [...Strings, ...Numbers, boolean];
將這兩種行為結(jié)合在一起,我們可以為 concat 編寫一個(gè)類型良好的簽名:
type?Arr = readonly any[];
function?concat<T?extends?Arr, U?extends?Arr>(arr1: T, arr2: U): [...T, ...U] {
????return?[...arr1, ...arr2];
}

盡管一個(gè)簽名仍然有些冗長(zhǎng),但它畢竟只有一個(gè),只需寫一次,并且在所有數(shù)組和元組上都具有可預(yù)測(cè)的行為。

這個(gè)功能很棒,在其他更復(fù)雜的場(chǎng)景中更有用。例如,考慮一個(gè)函數(shù)來部分應(yīng)用參數(shù),名為 partialCall。partialCall 接收一個(gè)函數(shù)(這里就叫 f)以及該函數(shù)期望的幾個(gè)初始參數(shù)。然后,它返回一個(gè)新函數(shù),接收它需要的其他所有參數(shù),收到后調(diào)用 f。
function?partialCall(f, ...headArgs) {
????return?(...tailArgs) =>?f(...headArgs, ...tailArgs)
}
TypeScript 4.0 改進(jìn)了 rest 參數(shù)和 rest 元組元素的推斷過程,因此我們可以類型化它并使其“正常工作”。
type Arr = readonly unknown[];
function?partialCall<T?extends?Arr, U?extends?Arr, R>(f: (...args: [...T, ...U])?=> R, ...headArgs: T)?{
????return?(...b: U) => f(...headArgs, ...b)
}
在這種情況下,partialCall 會(huì)知道其最初可以使用和不能使用哪些參數(shù),并返回一個(gè)可以正確接收和拒絕剩余內(nèi)容的函數(shù)。
const?foo = (x: string, y: number, z: boolean) =>?{}
// This doesn't work because we're feeding in the wrong type for 'x'.
const?f1 = partialCall(foo, 100);
// ~~~
// error! Argument of type 'number' is not assignable to parameter of type 'string'.

// This doesn't work because we're passing in too many arguments.
const?f2 = partialCall(foo, "hello", 100, true, "oops")
// ~~~~~~
// error! Expected 4 arguments, but got 5.

// This works! It has the type '(y: number, z: boolean) => void'
const?f3 = partialCall(foo, "hello");
// What can we do with f3 now?
f3(123, true); // works!
f3();
// error! Expected 2 arguments, but got 0.
f3(123, "hello");
// ~~~~~~~
// error! Argument of type '"hello"' is not assignable to parameter of type 'boolean'.

可變?cè)M類型創(chuàng)造了許多新模式,尤其是在函數(shù)組合方面。我們希望利用它來改善對(duì) JavaScript 內(nèi)置的 bind 方法的類型檢查。此外還有其他一些推斷改進(jìn)和模式,想了解更多信息,可以查看可變?cè)M的拉取請(qǐng)求。

https://github.com/microsoft/TypeScript/pull/39094

標(biāo)記的元組元素

改善元組類型和參數(shù)列表的體驗(yàn)很重要,因?yàn)樗刮覀兡軌驀@常見的 JavaScript 習(xí)慣用法進(jìn)行強(qiáng)類型驗(yàn)證——實(shí)際上只是對(duì)參數(shù)列表進(jìn)行切片和切塊,并將它們傳遞給其他函數(shù)。對(duì) rest 參數(shù)使用元組類型是其中的關(guān)鍵。

例如,以下函數(shù)使用元組類型作為 rest 參數(shù):
function?foo(...args: [string, number]): void?{
????// ...
}
應(yīng)該與以下函數(shù)沒有區(qū)別。
function?foo(arg0: string, arg1: number): void?{
????// ...
}
對(duì)于 foo 的任何調(diào)用者。
foo("hello", 42); // works
foo("hello", 42, true); // error
foo("hello"); // error
不過可讀性就有區(qū)別了。在第一個(gè)示例中,我們沒有第一個(gè)和第二個(gè)元素的參數(shù)名稱。盡管這些對(duì)類型檢查沒有影響,但元組位置上缺少標(biāo)記會(huì)難以傳達(dá)我們的意圖。因此,在 TypeScript 4.0 中,元組類型現(xiàn)在可以提供標(biāo)記。
type Range = [start: number, end: number];
為了進(jìn)一步加強(qiáng)參數(shù)列表和元組類型之間的聯(lián)系,我們讓 rest 元素和可選元素的語法與參數(shù)列表的語法一致。
type?Foo = [first: number, second?: string, ...rest: any[]];
標(biāo)記元組使用時(shí)有些規(guī)則,其中一條是:在標(biāo)記一個(gè)元組元素時(shí),還必須標(biāo)記元組中的所有其他元素。
type?Bar = [first: string, number];
// ~~~~~~
// error! Tuple members must all have names or all not have names.
值得注意的是,在解構(gòu)時(shí)標(biāo)記不需要我們用不同的名稱命名變量。它們純粹是為文檔和工具鏈服務(wù)的。
function?foo(x: [first: string, second: number]) {
????// ...
????// note:?we didn't need to name these 'first' and 'second'
????let?[a, b] = x;
????// ...
}

總的來說,當(dāng)利用圍繞元組和參數(shù)列表的模式,并以類型安全的方式實(shí)現(xiàn)重載時(shí),帶標(biāo)記的元組非常方便好用。實(shí)際上,TypeScript 的編輯器支持會(huì)在可能的情況下將它們顯示為重載。

了解更多信息,請(qǐng)查看帶標(biāo)記的元組元素的拉取請(qǐng)求。

https://github.com/microsoft/TypeScript/pull/38234

構(gòu)造器的類屬性推斷
當(dāng)啟用 noImplicitAny 時(shí),TypeScript 4.0 現(xiàn)在可以使用控制流分析來確定類中屬性的類型。
class?Square {
????// Previously: implicit any!
????// Now: inferred to `number`!
????area;
????sideLength;
????constructor(sideLength: number) {
????????this.sideLength = sideLength;
????????this.area = sideLength ** 2;
????}
}
如果構(gòu)造器的路徑并非都分配給一個(gè)實(shí)例成員,則該屬性可能被認(rèn)為是 undefined 的。
class?Square {
????sideLength;
????constructor(sideLength: number) {
????????if?(Math.random()) {
????????????this.sideLength = sideLength;
????????}
????}
????get?area() {
????????return?this.sideLength ** 2;
????????// ~~~~~~~~~~~~~~~
????????// error! Object is possibly 'undefined'.
????}
}
如果你更了解某些情況(例如,你擁有某種 initialize 方法),則當(dāng)你處于 strictPropertyInitialization 中時(shí),需要使用顯式類型注釋以及明確的賦值斷言(!)。
class?Square {
????// definite assignment assertion
????// v
????sideLength!: number;
????// ^^^^^^^^
????// type annotation
????constructor(sideLength: number) {
????????this.initialize(sideLength)
????}
????initialize(sideLength: number) {
????????this.sideLength = sideLength;
????}
????get?area() {
????????return?this.sideLength ** 2;
????}
}

更多信息請(qǐng)見拉取請(qǐng)求。

https://github.com/microsoft/TypeScript/pull/379200

短路賦值運(yùn)算符
JavaScript 和許多語言都支持一組稱為"復(fù)合賦值運(yùn)算符"的運(yùn)算符。復(fù)合賦值運(yùn)算符將一個(gè)運(yùn)算符應(yīng)用于兩個(gè)參數(shù),然后將結(jié)果賦給左側(cè)。你可能以前看過這些:
// Addition
// a = a + b
a += b;
// Subtraction
// a = a - b
a -= b;
// Multiplication
// a = a * b
a *= b;
// Division
// a = a / b
a /= b;
// Exponentiation
// a = a ** b
a **= b;
// Left Bit Shift
// a = a << b
a <<= b;

JavaScript 中有很多運(yùn)算符都有對(duì)應(yīng)的賦值運(yùn)算符!但是有三個(gè)值得注意的例外:邏輯和(&&),邏輯或(||)和空值合并(??)。

所以 TypeScript 4.0 支持了一個(gè)新的 ECMAScript 特性,添加了三個(gè)新的賦值運(yùn)算符:&&=,||= 和 ??= 。

這些運(yùn)算符非常適合替換下面這種代碼示例:
a?= a && b;
a?= a || b;
a?= a ?? b;
或者像下面這樣的 if 代碼段:
// could be 'a ||= b'
if?(!a) {
????a = b;
}
我們甚至看到了一些模式,可以在需要時(shí)懶惰地初始化值。
let?values: string[];
// Before
(values ?? (values = [])).push("hello");
// After
(values ??= []).push("hello");
在極少數(shù)情況下,你使用帶有副作用的 getter 或 setter 時(shí),需要注意的是這些運(yùn)算符僅在必要時(shí)執(zhí)行賦值。從這個(gè)意義上講,"短路"的不僅是運(yùn)算符的右側(cè),賦值本身也短路了。
obj.prop ||= foo();
//?roughly equivalent to either of the following
obj.prop ||?(obj.prop = foo());
if?(!obj.prop) {
????obj.prop = foo();
}
可以試著運(yùn)行 這個(gè)示例,看看它和總是執(zhí)行賦值有什么區(qū)別。
const?obj = {
????get?prop() {
????????console.log("getter has run");
????????// Replace me!
????????return?Math.random() < 0.5;
????},
????set?prop(_val: boolean) {
????????console.log("setter has run");
????}
};
function?foo() {
????console.log("right side evaluated");
????return?true;
}
console.log("This one always runs the setter");
obj.prop = obj.prop || foo();
console.log("This one *sometimes* runs the setter");
obj.prop ||= foo();

有關(guān)更多細(xì)節(jié)可以查看拉取請(qǐng)求。

https://github.com/microsoft/TypeScript/pull/37727

你也可以查看 TC39 的提案存儲(chǔ)庫(kù)。

https://github.com/tc39/proposal-logical-assignment/

catch 子句綁定支持 unknown
自 TypeScript 誕生以來,catch 子句變量始終按 any 類型化。這意味著 TypeScript 允許你對(duì)它們進(jìn)行任何操作。
try?{
????// ...
}
catch?(x) {
????// x has type 'any' - have fun!
????console.log(x.message);
????console.log(x.toUpperCase());
????x++;
????x.yadda.yadda.yadda();
}
上述代碼會(huì)有一些無法預(yù)期的行為!由于這些變量默認(rèn)情況下的類型為 any,因此它們沒有任何類型安全性可以防止無效操作。因此,TypeScript 4.0 現(xiàn)在允許你將 catch 子句變量的類型指定為 unknown。unknown 比 any 更安全,因?yàn)樗鼤?huì)在我們操作值之前提醒我們執(zhí)行某種類型檢查。
try?{
????// ...
}
catch?(e: unknown) {
????// error!
????// Property 'toUpperCase' does not exist on type 'unknown'.
????console.log(e.toUpperCase());
????if?(typeof?e === "string") {
????????// works!
????????// We've narrowed 'e' down to the type 'string'.
????????console.log(e.toUpperCase());
????}
}

盡管默認(rèn)情況下 catch 變量的類型不會(huì)更改,但我們將來可能會(huì)考慮使用新的 --strict 模式標(biāo)志,以便用戶選擇啟用此行為。同時(shí),應(yīng)該可以編寫一個(gè) lint 規(guī)則來強(qiáng)制 catch 變量具有如下顯式注解之一:: any 或: unknown。

有關(guān)更多信息,可以查看拉取請(qǐng)求。

https://github.com/microsoft/TypeScript/pull/39015

定制 JSX 工廠

使用 JSX 時(shí),fragment 是 JSX 元素的一種,允許我們返回多個(gè)子元素。當(dāng)我們第一次在 TypeScript 中實(shí)現(xiàn) fragment 時(shí),我們對(duì)其他庫(kù)如何利用它們并不了解。如今,大多數(shù)鼓勵(lì)使用 JSX 和支持 fragment 的庫(kù)都具有類似的 API 設(shè)計(jì)。

在 TypeScript 4.0 中,用戶可以通過新的 jsxFragmentFactory 選項(xiàng)來自定義 fragment 工廠。

例如,以下 tsconfig.json 文件告訴 TypeScript 以與 React 兼容的方式轉(zhuǎn)換 JSX,但將每個(gè)工廠調(diào)用(invocation)切換為 h 而不是 React.createElement,并使用 Fragment 而不是 React.Fragment。
{
??"compilerOptions": {
????"target": "esnext",
????"module": "commonjs",
????"jsx": "react",
????"jsxFactory": "h",
????"jsxFragmentFactory": "Fragment"
??}
}
如果需要基于各個(gè)文件使用不同的 JSX 工廠,則可以利用新的 /**?@jsxFrag */ 注釋。例如,下面的內(nèi)容:
// Note:?these pragma comments need to be written
// with a JSDoc-style multiline syntax to take effect.
/** @jsx h */
/** @jsxFrag Fragment */
import?{ h, Fragment } from?"preact";
let?stuff = <>
????<div>Hellodiv>
;
將輸出成這樣的 JavaScript:
// Note:?these pragma comments need to be written
// with a JSDoc-style multiline syntax to take effect.
/** @jsx h */
/** @jsxFrag Fragment */
import?{ h, Fragment } from?"preact";
let?stuff = h(Fragment, null,
????h("div", null, "Hello"));

查看拉取請(qǐng)求以獲取更多信息。

https://github.com/microsoft/TypeScript/pull/38720

加快了 build 模式的速度

以前,使用 --noEmitOnError 標(biāo)志時(shí),當(dāng)先前的編譯在 --incremental 下出現(xiàn)錯(cuò)誤,編譯速度將非常緩慢。這是因?yàn)榛?--noEmitOnError 標(biāo)志,上次編譯的任何信息都不會(huì)緩存在.tsbuildinfo 文件中。

TypeScript 4.0 對(duì)此進(jìn)行了更改,從而在這些情況下極大地提高了速度,進(jìn)而改進(jìn)了 --build 模式的場(chǎng)景(這意味著同時(shí)有 --incremental 和 --noEmitOnError)。

有關(guān)詳細(xì)信息,請(qǐng)查看拉取請(qǐng)求。

https://github.com/microsoft/TypeScript/pull/38853

帶有 --noEmit 的 --incremental

TypeScript 4.0 允許我們?cè)诶?--incremental 編譯時(shí)使用 --noEmit 標(biāo)志。以前不允許這樣做,因?yàn)?--incremental 需要發(fā)出.tsbuildinfo 文件。

有關(guān)詳細(xì)信息,請(qǐng)查看拉取請(qǐng)求。

https://github.com/microsoft/TypeScript/pull/39122

編輯器改進(jìn)

TypeScript 編譯器不僅可以為大多數(shù)主流編輯器提供較好的 TS 編輯體驗(yàn),還可以改進(jìn) Visual Studio 系列編輯器的 JavaScript 開發(fā)體驗(yàn)。

根據(jù)你使用的編輯器,在編輯器中使用新的 TypeScript/JavaScript 功能時(shí)會(huì)有區(qū)別:

  • Visual Studio Code 支持選擇不同版本的 TypeScript。另外,還有 JavaScript/TypeScript Nightly Extension 來緊跟最新版本(通常非常穩(wěn)定)。

  • Visual Studio 2017/2019 有上面的 SDK 安裝程序和 MSBuild 安裝。

更多信息見 TS 編輯器支持列表。

https://github.com/Microsoft/TypeScript/wiki/TypeScript-Editor-Support

轉(zhuǎn)換為可選鏈

可選鏈?zhǔn)且豁?xiàng)新功能,受到了廣泛的歡迎。TypeScript 4.0 在轉(zhuǎn)換常見模式時(shí)可以利用可選鏈和空值合并的優(yōu)勢(shì)!

我們認(rèn)為這種重構(gòu)應(yīng)該能捕獲大多數(shù)用例的意圖,尤其是當(dāng) TypeScript 對(duì)你的類型有更精確的了解時(shí)。

有關(guān)詳細(xì)信息,請(qǐng)查看拉取請(qǐng)求。

https://github.com/microsoft/TypeScript/pull/39135

/** @deprecated */ 支持

現(xiàn)在,TypeScript 的編輯支持可以識(shí)別聲明中是否帶有/** @deprecated*/ JSDoc 注釋。該信息顯示在自動(dòng)完成列表中,并作為編輯器可以特別處理的建議診斷。在像 VSCode 這樣的編輯器中,deprecated 的值通常顯示為刪除線樣式。

有關(guān)詳細(xì)信息,查看拉取請(qǐng)求。

https://github.com/microsoft/TypeScript/pull/38523

啟動(dòng)時(shí)的部分編輯模式

很多用戶抱怨啟動(dòng)時(shí)間緩慢,尤其是在大型項(xiàng)目中。具體來說,罪魁禍?zhǔn)淄ǔJ且粋€(gè)稱為項(xiàng)目加載的過程,該過程與我們編譯器的程序構(gòu)建步驟大致相同。這一過程從一組初始文件開始,解析它們、解析它們的依賴、再解析那些依賴,解析那些依賴的依賴,等等,最后需要花費(fèi)很長(zhǎng)時(shí)間。項(xiàng)目越大,啟動(dòng)延遲可能會(huì)越長(zhǎng)。

所以我們一直在努力為開發(fā)人員提供一種新的模式,在獲得完整的語言服務(wù)體驗(yàn)之前提供部分體驗(yàn)。這里的核心思想是,編輯者可以運(yùn)行僅具有單個(gè)文件視圖的輕量級(jí)部分服務(wù)器。

這種新模式可以將 TypeScript 在代碼庫(kù)上開始交互之前的準(zhǔn)備時(shí)間從 20 秒到 1 分鐘縮短到只有幾秒鐘。比如說,在較大的代碼庫(kù)上重啟編輯器時(shí),TS 3.9 版沒法立即提供自動(dòng)完成和快速信息;另一方面,TS 4.0 可以立即提供完整的編輯體驗(yàn),同時(shí)在后臺(tái)加載整個(gè)項(xiàng)目。

當(dāng)前,唯一支持此模式的編輯器是 Visual Studio Code,但 UX 和功能仍有改進(jìn)的余地。我們列出了準(zhǔn)備加入的改進(jìn),希望獲得更多反饋。

https://github.com/microsoft/TypeScript/issues/39035

有關(guān)更多信息,你可以查看原始提案,拉取請(qǐng)求,以及后續(xù)的 meta 問題。

https://github.com/microsoft/TypeScript/issues/37713

更智能的自動(dòng)導(dǎo)入

自動(dòng)導(dǎo)入是一個(gè)了不起的功能。但是,自動(dòng)導(dǎo)入在用 TypeScript 編寫的包上不起作用——也就是說,我們得在項(xiàng)目的其他位置至少寫了一個(gè)顯式導(dǎo)入。

為什么自動(dòng)導(dǎo)入適用于 @types 軟件包,而不適用于使用自己類型的包呢?其實(shí)自動(dòng)導(dǎo)入是通過檢查項(xiàng)目中已經(jīng)包含的軟件包來實(shí)現(xiàn)的。TypeScript 有一個(gè)怪癖,可以自動(dòng)包括 node_modules/@types 中的所有包,而忽略其他包;但爬取所有 node_modules 包的開銷可能會(huì)很昂貴。

當(dāng)你嘗試自動(dòng)導(dǎo)入剛剛安裝但尚未使用的內(nèi)容時(shí),這些都會(huì)導(dǎo)致糟糕的體驗(yàn)。

TypeScript 4.0 現(xiàn)在可以包含你在 package.json 的 dependencies(和 peerDependencies)字段中列出的包。這些包中的信息僅用于改進(jìn)自動(dòng)導(dǎo)入,不會(huì)更改類型檢查等其他內(nèi)容。這樣就避免了遍歷 node_modules 目錄的成本,使我們可以為所有帶類型的依賴項(xiàng)提供自動(dòng)導(dǎo)入。

當(dāng)你的 package.json 列出了超過十項(xiàng)尚未導(dǎo)入的類型化依賴項(xiàng)時(shí),這個(gè)功能會(huì)自動(dòng)禁用,以避免緩慢的項(xiàng)目加載過程。要強(qiáng)制開啟它或完全禁用它,你可以配置編輯器。在 Visual Studio Code 中是"Include Package JSON Auto Imports"設(shè)置(或 typescript.preferences.includePackageJsonAutoImports)。

有關(guān)詳細(xì)信息,可以查看提案問題以及拉取請(qǐng)求。

https://github.com/microsoft/TypeScript/issues/37812

我們的新網(wǎng)站!

TypeScript 網(wǎng)站最近被徹底重寫了!

詳細(xì)信息可以參考之前的文章:

《TypeScript 新版網(wǎng)站上線:帶來了新的導(dǎo)航機(jī)制》

重大更改
lib.d.ts

我們的 lib.d.ts 聲明已更改,具體來說是 DOM 的類型已更改。主要是刪除了 document.origin,它僅在 IE 的舊版本中有效,而 Safari MDN 建議改用 self.origin。

屬性重寫訪問器(反之亦然)是錯(cuò)誤
以前,只有在使用 useDefineForClassFields 時(shí),屬性重寫訪問器或訪問器重寫屬性是一個(gè)錯(cuò)誤;但現(xiàn)在,在派生類中聲明一個(gè)將重寫基類中的 getter 或 setter 的屬性時(shí)總是發(fā)出錯(cuò)誤。

class?Base?{
????get foo() {
????????return?100;
????}
????set foo() {
????????//?...
????}
}
class?Derived?extends?Base?{
????foo = 10;
//??~~~
//?error!
//?'foo'?is?defined as?an accessor in?class?'Base',
//?but is?overridden here in?'Derived'?as?an instance property.
}

class?Base?{
????prop = 10;
}
class?Derived?extends?Base?{
????get prop()?{
????// ~~~~
????// error!
????// 'prop' is defined as a property in class 'Base', but is overridden here in 'Derived' as an accessor.
????????return?100;
????}
}

有關(guān)詳細(xì)信息,查看拉取請(qǐng)求。

https://github.com/microsoft/TypeScript/pull/37894

delete 的操作數(shù)必須是可選的
在 strictNullChecks 中使用 delete 運(yùn)算符時(shí),操作數(shù)現(xiàn)在必須為 any、unknown、never 或?yàn)榭蛇x(因?yàn)樗陬愋椭邪?undefined)。否則,使用 delete 運(yùn)算符是錯(cuò)誤的。
interface?Thing {
????prop: string;
}
function?f(x: Thing) {
????delete?x.prop;
????// ~~~~~~
????// error! The operand of a 'delete' operator must be optional.
}

關(guān)于更多信息,查看拉取請(qǐng)求。

https://github.com/microsoft/TypeScript/pull/37921

TypeScript 的 Node 工廠用法已棄用

如今,TypeScript 提供了一組用于生成 AST 節(jié)點(diǎn)的“工廠”函數(shù)。但是,TypeScript 4.0 提供了新的 node 工廠 API。因此 TypeScript 4.0 決定棄用使用這些舊函數(shù),推薦改用新函數(shù)。

有關(guān)更多信息,請(qǐng)查看拉取請(qǐng)求。

https://github.com/microsoft/TypeScript/pull/35282

下一步計(jì)劃

TypeScript 4.1 的迭代計(jì)劃已經(jīng)上線了,你可以大致了解一下。

https://github.com/microsoft/TypeScript/issues/40124

同時(shí),你可以在工作區(qū)或編輯器中使用 nightly 構(gòu)建來預(yù)覽 4.1 中添加的新特性。無論你是在使用 TypeScript 4.0 還是下一版本,我們都希望聽到你的反饋!可以通過 Twitter 聯(lián)系我們,或在 GitHub 上發(fā)起問題。

我們?cè)僖淮螢樯鐓^(qū)所做的一切工作和奉獻(xiàn)精神深表感謝。我們希望讓 TypeScript 和 JavaScript 的編碼體驗(yàn)成為你應(yīng)得的純粹樂趣。為此,我們需要改善語言和編輯體驗(yàn)、提升性能、迭代我們的用戶體驗(yàn)、降低入門和學(xué)習(xí)的門檻等等。

非常感謝大家,請(qǐng)享用 4.0 版本吧,編程愉快!

延伸閱讀

https://devblogs.microsoft.com/typescript/announcing-typescript-4-0/

??愛心三連擊

點(diǎn)分享
點(diǎn)點(diǎn)贊
點(diǎn)在看
瀏覽 55
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評(píng)論
圖片
表情
推薦
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 69超碰| 中国极品少妇XXX| 成人自拍偷拍视频| www.17c嫩嫩草色蜜桃网站| 日本一级婬片免费放| 97精品人妻一区二区三区香蕉农| 日韩中文毛片| 无码视频免费在线观看| 欧美一级黄色A片| 日韩成人黄片| 青青草视频偷拍| 五月花在线视频| 91精东传媒果冻传媒| 国产黄色视频在线免费观看| 特级西西人体WWWWW| 蜜桃传媒一区二区亚洲A| 国产高潮视频在线观看| 无码人妻日韩精品一区二区三| 日韩高清无码中文字幕| 久久免费视屏| 成人午夜在线视频| 欧美性生交18XXXXX无码| 操美女的逼| 少妇被躁到高潮无码| 一起操在线观看| 国产又爽又黄在线看视频| 无码精品成人观看A片| 国产AV电影网| 丰满的人妻一区二区10| 丝袜制服中文字幕无码专区| 超碰97免费| 一本色道久久综合亚洲精品久久| 一道本高清无码视频| 国产成人精品av在线观看| 激情久久综合| 男女做爱无码| 亚洲av性爱| 免费v片| 三级在线视频| 少妇视频一区| 亚洲午夜精品视频| 色欲五月天| 蜜臀AV在线观看| 婷婷日韩在线| 国产一区二区免费在线观看| 大香蕉精品欧美色综合2025| 国产骚逼| 8050午夜网| 午夜看黄片| 欧美午夜精品成人片在线播放 | 黑人AV| 大鸡巴在线| 日韩AV小说| 久久伊人大| AV无码在线免费观看| 超碰人人网| 人人操超碰在线观看| 高清无码视频免费版本在线观看| 苍井空中文字幕在线观看| 韩国高清无码60.70.80| 午夜福利成人| 综合天堂AV久久久久久久| 神马久久午夜| 日韩无码黄片| 深夜福利网| 中文无码字幕在线| 在线观看成人18| www.xxx国产| 玖玖色视频| 中文字幕+乱码+中文字幕一区 | 网址你懂得| 特级婬片AAAAAAA级| 天天干天天日天天射| 婷婷午夜精品久久久久久性色| 男女黄色免费网站| 国产乱色精品成人免费视频| 青青草视频免费在线观看| 又大又长又粗91| 国内自拍激情视频| 特黄AAAAAAAA片视频| 国产精品黄色| 超碰在线99| 91在线无码| 日韩三级在线| 日韩A片无码ⅩXXXX| 亚州精品人妻一二三区| 一区二区色| 91人妻在线视频| 欧美亚洲中文| 中文字幕在线观看不卡| 国产中文视频| 成人电影一区二区| 青青青草视频在线观看| 婷婷三级片| 中文字幕欧美视频| 午夜福利91| 我和岳m愉情XXXⅩ视频| 国产精品内射视频| 成人激情免费视频| ChineSe露脸老女人| 蜜桃传媒一区二区亚洲A| 天天操天天日天天射| 91x色| 国产麻豆传媒| 国产黄片一区二区| 久久天堂AV综合合色蜜桃网| 国产性爱自拍视频| h片在线免费观看视频| 久久久精品网站| 操逼爽| 日韩有码中文字幕在线观看| 91九色网| 人妻福利导航| 中国免费一级无码成人片| 精品欧美一区二区三区久久久| 国产a片免费看| AAA久久| 日韩成人视频在线| 成人黄色视频免费| 午夜久久久久久久久久久久91| 色色视频在线观看| 人妻丰满熟妇av无码区| 中文字幕精品在线观看| 国产午夜在线观看| 男人天堂V| 偷拍一区二区| 久久久毛片| 伊人在线观看视频| 亚州AV操屄| 四虎无码丰满人妻| 日韩在线视频网| 黄色一级在线| 亚洲最新AV在线| 亚洲福利社| 国产小视频在线看| 日本啪啪网站| 国产成人精品一区| 蜜桃精品视频在线观看| 四lll少妇BBBB槡BBBB| 91丨国产丨熟女熟女| 中文字幕人妻丰满熟妇| 色五月综合| 青娱乐亚洲领先| 老骚老B老太太A片| 欧美黄色激情视频网站| 久久久人妻无码精品蜜桃| 欧美精品欧美精品系列| 国产精品卡一| 99re国产视频| 91成人福利视频| 91精品国产aⅴ一区二区| 久久久久久久91| A黄色片| 久久av一区二区三区| 久热超碰| 亚洲精品欧美久久婷婷| 国内自拍2025| 久热网站| 成人在线激情| 天天干妹子| 久久午夜电影| 最近2021中文字幕免费| 天天干天天添| 翔田千里被操120分钟| 在线观看视频日韩| 丁香五月伊人| 国产黄片一区二区三区| 九九天堂| 亚洲电影无码| 五月精品| 69久蜜桃人妻无码精品一区| 免费无码在线看| 精品国产AV鲁一鲁一区| 亚洲色图88| 激情无码一区二区三区| 久久久久无码精品国产91福利| 91亚洲一线产区二线产区| 欧美9999| 国产精品免费久久影院| 免费无码一区二区三区四区五区| 看A片在线| 成人毛片18| 超碰免费观看| 99成人国产精品视频| 插逼综合网| 亚洲vs天堂vs成人vs无码| 成人视频18+在线观看| 在线免费看黄视频| 日韩啪啪网站| 荫蒂添出高潮A片视频| 久久成人精品| 木牛AV| 操逼免费观看视频| 人人天天爽| 亚洲午夜精品视频| 亚洲A片在线观看| 一区二区三区久久久| 国产女人免费| 高清日韩欧美| 色婷婷国产精品综合在线观看| 亚洲成人精品视频| 亚洲vs无码秘蜜桃少妇| 就去色色五月丁香婷婷久久久| 蜜臀成人片| 亚洲少妇人妻| 五月婷婷六月香| 国产无码成人免费| 天天爽夜夜爽夜夜爽精品视频| 亚洲国产视频在线观看| 欧美不卡在线观看| 婷婷久久婷婷| 91中文在线| 人人妻人人操人人爽| 岛国av片| 婷婷五月天色播| 日韩三级成人| 亚洲AV无码成人精品| 性欧美成人播放77777| 亚洲中文字幕成人| 女同久久另类99精品国产91| 午夜高清| 中文人妻| 免费观看的av| 欧美日韩国产性爱| 欧美精品91| 熟女无码| 亚洲精品日日夜夜| 欧美一级日韩| 国产精品欧美精品| 操比视频| 天天干天天日蜜臀色欲av| 熟女熟妇人妻一区二区三区 | 9久9久9久9久女女女女| 亚洲图片一区| 日韩无码第一页| 男女免费av| 久久婷婷五月综合伊人| 欧美熟妇精品黑人巨大一二三区| 亚洲秘无码一区二区三区胖子| 在线观看免费高清无码| 69久久久久| 黄片免费看视频| 无码人妻一区二区三区免费九色| av日韩在线播放| aaa成人| 丰滿人妻一区二区三区| 国产中文| 国产精品嫩草久久久久yw193| 求欧美精品网址| 高清无码视频在线免费观看| 鸭子AV| 国产七区| 亚洲字幕无码| 搡BBB,搡BBBB,搡BBBB| 中国人妻HDbute熟睡| 天天精品视频| 毛片视频网站| 一级操逼视频免费观看| 热久色| 日韩高清无码一区二区三区| 波多野结衣无码高清| 亚洲精品乱码在线| 婷婷激情av| 日韩av电影在线观看| 国产欧美一区二区三区国产幕精品| 免费看无码| 天天拍天天操| 精品九九| 日韩在线国产| 日韩2区| 91综合网| 999精品| 久久狼友| 99热这里有精品| 色噜噜狠狠一区二区三区300部| 激情五月天视频| 东京热综合网| 91精品国产亚洲| 日韩在线观看视频网站| 色播五月丁香| 91在线欧美| 91AV成人| www.操逼| 337p粉嫩噜噜噜| 欧美性猛交XXXX乱大交| 黄片免费视频| 91嫖妓站街按店老熟女| 欧美成人手机在线| 色色色色色色色色欧美| AV天堂中文字幕| www.17c嫩嫩草色蜜桃网站 | 91av在线播放| yjizz视频网| 男人AV在线| 日韩无码人妻久久一区二区三区 | а天堂中文在线资源| 高清无码免费视频| 91久久久久久久久久久久18| 中文字幕免费高清在线观看| 亚洲无码三级片在线观看| 麻豆精品秘国产| 尻屄视频在线观看| 国产色自拍| 日韩电影| 日韩三级电影| 成人自拍视频在线| 性久久久久久久| 大香蕉伊人成人| 一级a免一级a做免费线看内裤的注意事项 | 在线观看的AV| 懂色av粉嫩av蜜臀av| 国产成人99久久亚洲综合精品| 日韩一区二区视频| 成人自拍网站| 婷婷精品在线| 性BBwBBwBBwBBw禽| 欧美成人中文字幕在线| 午夜福利成人视频| 亚洲国产另类精品| 欧美日韩伊人| 亚洲成人网站免费观看| 无码在线观看免费视频| 久久视频免费| 亚洲三级片在线观看| 日本无码视频在线观看毒| 亚洲v欧美v| 天天色色天天| 亚洲超碰在线| 男人天堂AV片| 成人免费视频一区二区三区| 岛国AV在线播放| 欧美日韩一区二区三区| 一卡二卡在线视频| 亚洲午夜在线| 日韩做爱视频| 婷婷色吧| 操碰视频在线| 欧美国产日韩在线观看| 婷婷综合网| 日韩性无码| 大香蕉在线75| 国产一卡二卡三卡| xiuxiuav| 免费在线观看AV网站| 91精品丝袜久久久久久久久粉嫩| 人妻免费视频| 在线观看国产欧美| 日无码视频| 豆花视频logo| 大香蕉一级红色片青青河边草| 久久婷婷五月丁香| 婷婷在线综合| 自拍毛片| 丁香五月六月婷婷| 色婷婷亚洲| 免费草逼网站| 久色国产| 91大熟女91大腚女人| 骚妇大战黑人15P| 韩国高清无码| 爱爱免费不卡视频| 狠狠操AV| 人成视频免费观看| 国产91在线观看| 国产一区二区00000视频| 国产麻豆精品成人免费视频| 狠狠色婷婷7777| 国产一级黄色大片| 成人黄网免费观看视频| 老司机在线免费视频| 99Re66精品免费视频| 人妻人玩| 神马午夜视频| 山东熟妇搡BBBB搡BBBB| 亚洲AV人人夜夜澡人人| 国产免费操逼视频| 不卡无码中文字幕| 操逼网站在线观看| 96精品久久久久久久久久| 2025av天堂网| 毛片天堂| 国产毛片一区二区| 卡一卡二卡三| 自拍成人视频| 三级片在线看片AV| AV网站免费在线观看| 国产情趣网站| 91首页| 天天操天天日天天干| 一级二级三级毛片| 人人爽人人爽人人爽| 伊大香蕉在线| 韩国精品无码一区二区三区18| 大香蕉在线视频观看| 四虎黄色片| 东京亚洲无码| 一本大道DVD中文字幕| 黄色视频在线免费观| 欧美A片在线| 亚洲无码在线观看免费| 日本三级黄色| 大鸡巴在线| 最近最经典中文MV字幕| 久久青草视频| 亚洲中文字幕2019| 悠悠无码一区日韩妇女| 91三级在线观看| 黄色视频在线免费观看高清视频| 中文字幕熟女| 91精品国产成人www| 99国产精品99久久久久久粉嫩 | 91成人在线影院| 男插女青青影院| 香蕉中文在线| 日韩人妻一区二区| 亚洲日韩在线免费观看| 午夜操日在线| 日韩AⅤ| 无码xx| 99久久婷婷国产综合精品hsex | 久久九| 黑人亚洲娇小videos∞| 一级a片免费看| 久久艹伊人| 成人黄色免费| 日韩久久中文字幕| 大香蕉在线免| 亚洲国产精品久久| 成人一区在线观看| 人人肏肏人人| 成人做爰100片免费观看视频 | 色五月激情| 亚洲天堂精品在线| 国产综合色婷婷精品久久| 欧美亚洲日韩国产| 偷拍亚洲综合| 黄色小电影在线观看| 影音先锋国产av| 日韩欧美色图| 一级黄色免费视频| 日韩亚洲在线| 色色五月天网站| 日韩精品在线播放| 青娱乐老视频| 91视频综合网| 亚洲理论电影| 青青免费在线视频| 懂色av粉嫩AV蜜臀AV| 伊人久久国产| 九色蝌蚪9l视频蝌蚪9l视频成人熟妇 | 特黄网站| 码人妻免费视频| 亚洲天堂在线观看视频网站| 五十路在线视频| 亚洲成人无码精品| 日本女人高潮视频| 五月婷婷色色| 亚洲无码专区视频| 老湿机91| 超碰天天干| 婷婷色六月| 伊人久久在线| 久久精品国产亚洲| 亚洲无码一卡二卡| 四川妇搡BBBB搡BBBB| 国产免费AV片| www.97超碰| 欧美色图色就是色| 黄色三级网站| 国产激情福利| 婷婷婷色| 国产精品探花熟女| 97国产视频| 亚洲无码一二区| 这里只有精品视频| 美女天堂网| 亚洲黄色激情| 一本一道久久综合狠狠躁牛牛影视| 成人免费视频国产免费麻豆,| 黑人毛片91久久久久久| 一级做a爰片毛片A片| 色色欧美| 久久免费视频1| 少妇做爱特级AAA| 国产精品久久久久久久免牛肉蒲| 欧美人与禽乱婬A片| 亚洲日韩欧美一区二区天天天 | 狠狠躁婷婷天天爽综合| 亚洲成人在线免费观看| 操屄网| 天天日少妇| 微拍福利一区二区| 51福利视频| 中文字幕-区二区三区四区视频中国| 波多野结衣久久精品| 亚洲无人禁区| 国产精品一级| av午夜| 七六十路の高齢熟妇无码| 99三级片| 国产a一级a毛一级视频| 亚洲成人黄色| 青青草激情视频| 精品无码一区二区三区的天堂| 少婦揉BBBB揉BBBB揉| 西西人体大胆ww4444图片| 一区二区在线视频| 日本黄网站| 久久久WWW成人免费精品| 男女av网站| 亚洲免费观看在线观看| 亚洲AⅤ欧美AⅤ| 国产成人在线免费观看| AV免费播放| 一区二区三区久久久久〖网:.〗| 北条麻妃91人妻互换| 闺蜜AV| 五月丁香激情六月| 亚洲无码影视| 黄网在线看| 亚洲精品97久久中文字幕| 黄色免费看| 精品一区二区三区四区五区六区| 91精品国产综合久久久久久久| 欧美成人中文字幕| 靠比免费| 国产成人一区| 久久精品视频免费| 国产人人看| 翔田千里无码破解| 男女无套在线观看免费| 精品三级在线观看| 欧美老妇BBBBBBBBB| 黄片高清免费观看| 91在线视频| 伊人网视频在线观看| 久久视频精品| 五月天婷婷av| 天天操天天操天天| 亚洲精选中文字幕| 国产毛片精品一区二区色欲黄A片| 日韩极品在线观看| 色婷婷五月激情| 在线成人小视频| 韩国高清无码60.70.80| 国产熟妇搡BBBB搡BBBB毛片| 欧美精品在线播放| 最近中文字幕免费MV第一季歌词怀孕 | 中日韩黄色视频| 国产一区二区久久| 秋霞日韩| 国产精品女人精品久久久天天| 色丁香视频在线观看的| 丁香五香天堂网| 中文字幕在线观看日韩| 一曲二曲三曲在线观看中文字| 欧美一区二区三曲的| 91人妻无码成人精品一区二区| 高清无码在线观看18| 国产中文| 三级片在线看片AV| 北条麻妃在线观看香蕉| 午夜老司机福利| 中文字幕在线观看免费高清完整版在线观看 | 佳佳女王footjob超级爽| 在线观看污视频| 久久黄色网址| 日韩操片| 嘉兴少妇按摩69XX| 日韩无码视频网| 特级西西444www大精品| 青青草手机在线观看| 国产精品无码7777777| 2025天天干| 国产乱码一区二区三区的区别| 黄片视频免费播放| 狼人一区二区| 免费无码毛片一区二区A片| 91在线无码精品秘入口电车| 作爱免费视频| 高潮喷水AⅤ| 国产美女一级特黄大片| 欧美丝袜脚交xxxxBH| 偷偷撸在线| 国产不卡精品| 五月色综合网| 免费一级无码婬片A片AAA毛片| 女毛片| 无码免费播放| 夜夜骚av一区二区三区| 做爱网站| 一级黄色大毛片| 国产性精品| 国产在线观看mv免费全集电视剧大全| 亚洲va欧美ⅴa在线| 色哟哟网站| 北条麻妃AV观看| 亚洲黄色三级| 中文字幕福利视频| 中文字幕久久人妻无码精品蜜桃| 中国字幕在线观看韩国电影| 亚洲欧美国产精品专区久久| 91豆花视频18| 婷婷爱要操| 西西西444www无码视频| 少妇搡BBBB搡BBB搡18禁| 日韩欧美视频在线播放| 囯产一级a一级a免费视频| 亚洲无码精品一区| 美女黄色免费网站| 午夜福利亚洲| 97人人操| 午夜日韩乱伦| 日韩极品在线观看| 日本黄色视频在线免费观看| 久久国产精品一区二区三区 | 北条麻妃AV观看| 欧美特大黄| 免费视频一二三区| 91乱子伦国产乱子伦| 色欲国产精品欧美在线密| 777性爱| 中文激情网| 久草视频播放| 天天色色综合| 日本黄色A片| 久久人人做| av无码av天天av天天爽| 伊人精品在线| 在线中文无码| 69久久| 国产成人毛片18女人18精品| 日本精品视频一区二区| 亚洲成人影片在线观看| 蜜芽av在线| 狼友初视频在线观看| 国产精品一卡二卡三卡| 无码人妻一区二区三区在线视频不卡| 久久精品99久久久久久| 潮喷在线| 苍井空无码一区二区三区| h视频免费看| 超碰人人爱国产视| 日韩一级免费视频| 在线观看av中文字幕| 操逼免费视频网站| 97在线视频免费观看| 日本黄色三级片| 婷婷激情中文字幕| 亚洲第一色婷婷| 啪啪视频最新地址发布页| 高清无码视频网站| 婷婷五月免费视频| 天堂网在线播放| 精品69| 久青操| 亚洲丝袜av| 精品成人无码| 操逼综合网| 四虎成人精品永久免费AV九九 | 亚洲成人a| 91网站免费在线观看| 免费看无码网站成人A片| 大BBBw大BBBW另类| 91成人福利视频| 天天插天天干| gogogo免费高清在线偷拍| 日韩久久中文字幕| 日韩免费高清无码| 亚洲无码A片在线| 黄色视频免费在线观看网站| 操BBBB| 自拍无码视频| 十八女人高潮A片免费| 东北女人操逼| 豆花精品视频| 人人看人人搂人人摸| 成人在线免费视频观看| 欧美三级在线观看视频| 91.www91成人影视在线观看91成人网址9 | a无码| 国产精品1区2区3区| www.91在线| 欧美熟女性爱| 欧美日韩在线视频免费观看| 黄色AA片| 精品女同一区二区三区四区外站在线| 国产第一精品| 欧美福利导航| 蜜芽视频| 久久国产性爱| 亚洲国产成人在线| 国产精品污www在线观看| 玖玖在线视频| 黄色大片在线播放| 91狠狠| 色99网站| 最新中文字幕免费MV第一季歌词| 2025AV中文字幕| 老太婆擦BBBB撩BBBB| 欧美精品久久久久久| 天堂网资源| 西西人体大胆ww4444多少集| 成年人性生活免费视频| 午夜偷拍| 丝袜美女足交| 成人做爰黄A片免费视频网站野外 国产成人午夜精品无码区久久麻豆 | 国产精品自产拍| 欧美级毛片一夜| 北岛玲视频在线| 日本A片在线播放| www,操逼| 京熱大亂交无碼大亂交| 国产熟女一区二区视频网站| 国产一区二区电影| www.尤物| 色婷婷婷| 日本伊人在线综合视频| 日本豆花视频| 黑人大香蕉| 免费AV网站在线| 杨贵妃一级婬片90分钟| 最新福利视频| 女同久久另类99精品国产91 | 亚洲精品乱码久久久久久蜜桃91 | 午夜操逼| 91在线一区二区三区| 日本操逼在线播放| 日韩福利网| 黄色视频在线观看亚洲一区二区三区免费 | 亚洲中文字幕人妻| 亚洲综合社区在线| 永久免费黄色视频| 操美女影院| 成人A片免费视频| 极品少妇视频| 亚洲va视频| 国产小毛片| 午夜看黄片| 91av一区二区三区| 在线看a片| 国产视频入口| 国产一级a片| 精品美女视频在线观看免费软件| 午夜免费播放观看在线视频| 青娱乐精品在线| 久久人人操| 亚洲黄色免费观看| 超碰中文字幕| 天天爽天天爽夜夜爽毛片| 色999在线播放视频| 色中色在线视频| 豆花视频成人网站入口| 欧美精品无码| 日韩成人无码电影网站| 亚洲天天操| 99热这里只有精品7| 少妇BBBBBB| 91热在线| 东京热视频网址| 77Q视频| 在线观看av网站| 成人亚洲天堂| 91在线视频精品| 91人妻人人澡人人添人人爽| 亚洲中文字幕久久日| 亚洲中文免费视频| 欧美怡红院视频| 久久久婷| 中文字幕熟女| 热久久视频| 丁香激情网| 爆乳一区二区三区| 精品久久久999| 欧美a视频| 久久黄色视频免费观看| 日韩中文无码一级A片| 亚洲精品成人7777777| 日韩不卡av| 老女人日逼| caopor在线| 中文资源在线观看| 免费操逼| 97精品在线视频| 欧美在线一级片| 久久1234| 国产色情在线| chinese搡老熟老妇人| 天天噜天天操| 成人精品久久久| 亚洲二区在线| 黄色激情av| 一区二区三区日韩| 免费黄色三级片| 亚洲AV成人片色在线观看高潮| 在线观看AV91| 六月激情婷婷| 国产精品欧美一区二区| 日韩性爱网址| 日韩成人电影| 成人看片黄a免费看视频| 亚洲色图1| 日韩91在线视频| 91人人妻| 日本精品无码a62v在线| 国产亚洲精品成人a| 欧美操逼免费视频| 性BBwBBwBBwBBw禽| av网站免费看| av福利在线| 国产三级片视频在线观看| 日日爽夜夜爽| 亚洲精品999| 日韩久久高清| 亚洲色成人中文字幕在线| 欧美操操操| 99视频热| 亚洲一区二区精品| 蜜臀av网| 亚洲成人情趣大香蕉| 91av视频在线观看| 内射无码专区久久亚洲| AAA成人| 国产在线观看一区| 波多野结衣AV在线| AV色片| 一级AA视频| 五月天超碰| a视频在线免费观看| 福利在线| 91久久久久久久久久久久18| 一区二区成人免费视频| 91香蕉视频| 夜夜爽久久精品91| 免费在线观看a片| 亚洲精品国产成人AV在线| 伊人免费视频在线观看| 亚洲操逼无码| 性爱无码视频| 国产AV一区二区三区四区| 91久久精品视频| 久久久精品欧美| 国产成人无码精免费视频| 一本色道久久综合狠狠| 综合色国产精品欧美在线观看| 亚洲图片欧美色图| 九色PORNY9l原创自拍| 久久久久久久大香蕉| 大香蕉综合久久| 另类国产| 亚洲午夜久久| 精品国产精品国产精品国产网站 | av资源免费观看| 欧美高清无码在线观看| 12——13女人毛片毛片| 中文字幕av网| 日韩无码a| AV中文字幕电影| 在线观看免费欧美操逼视频| 亚洲综合91| 五月婷久久| 亚洲天堂精品视频| 四虎蜜桃| 一区二区在线免费观看| 北条麻妃九九九在线视频| 男女性爱视频免费| 翔田千里无码精品| 久久精品一区二区| 国产免费AV片| 在线观看者亚洲| av片在线免费观看| 日本天堂在线| 午夜乱论| 午夜偷拍| 日韩在线视频一区二区三区| 日韩精品视频一区二区三区| 黄色成人在线观看视频| 欧美视频一| 青青操色| 超碰免费视| 亚洲中文字幕电影| 亚洲有码中文字幕| 亚洲成人毛片| 日韩成人精品| 亚洲视频免费观看| h片在线免费观看| 人人妻人人操人人爽| 欧美成人精品无码| 啪啪啪免费网站| 无码乱伦| 人妻精品一卡二卡| 亚洲男人综合| 特黄特色免费大片| a片在线电影网| 免费一级婬片AAA片毛片A级 | 日本无码嫩草一区二区| 四虎在线观看| 成人黄色在线视频| 人人摸人人看| 成人影视1-23|