精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

我讀 Typescript 源碼的秘訣都在這里了

開發 前端
T extends boolean 這部分是一個 ConditionType,有 checkType、extendsType、trueType、falseType 四個屬性分別代表不同的部分。

 [[427265]]

這篇文章整理了我是怎么讀 Typescript 源碼的,類似的技巧也可以用于其他庫的源碼閱讀。

先從一個 ts 的語法開始:

Test<T> 這個高級類型,有一個泛型參數 T,當 T 傳入的類型為聯合類型的時候,有兩種情況:

  • 如果 checkType(extends 左邊的類型) 是 T,則把聯合類型拆開后解析類型,最后合并成一個聯合類型返回。
  • 如果 checkType 不是 T,把聯合類型整體作為 T 來解析,返回解析后的類型。

這個語法叫 Distributive Condition Type,分布式條件類型。設計的目的就是為了簡化 Test<number> | Test<boolean> 的情況。

這里不談這個語法設計的怎么樣,我們通過這個語法的實現作為抓手,來探究一下 ts 源碼應該怎么讀。

類型的表示法:類型對象

ts 會把源碼進行 parse,生成 AST,然后從 AST 中解析出類型信息。

ts 的類型信息是通過類型對象來存儲的,我們來看幾個例子。(可視化的查看 AST 可以使用 astexplorer.net 這個網站。)

上面定義了四個類型:

a 類型是 LiteralType,字面量類型,literal 屬性保存具體的字面量,這里是 NumericLiteral,數字字面量。

b 類型是 UnionType,聯合類型,types 屬性保存了它所包含的類型,這里是兩個 LiteralType

T extends boolean 這部分是一個 ConditionType,有 checkType、extendsType、trueType、falseType 四個屬性分別代表不同的部分。

可以看到,T 是一個 TypeReference 類型,也就是它只是一個變量引用,具體的值還是泛型參數傳入的類型。

Test<number | boolean> 也是一個 TypeReference,類型引用。有 typeName 和 typeArguments 兩個屬性,typeName 就是它引用的類型 Test,typeArguments 就是泛型參數的值,這里是 UnionType。

所以說,類型在 ts 里面都是通過類型對象來表示的。

比較特別的是 TypeReference 類型,它只是一個引用,具體的類型還得把類型參數傳入所引用的類型,然后求出最終類型。比如這里的 Test<number | boolean> 的類型,最終的類型是把參數 number | boolean 傳入定義的那個 ConditionType 來求出的。這就是 ts 的高級類型。

理解了類型是怎么表示的,高級類型和泛型參數都是什么,接下來我們就可以正式通過調試 ts 源碼來看下 ConditionType 的解析過程了。

VSCode 調試 Typescript 源碼

首先,我們要把 ts 源碼下載下來(加個 depth=1 可以下載單 commit,速度比較快)

  1. git clone --depth=1 git@github.com:microsoft/TypeScript.git 

然后可以看到 lib 目錄下有 tsc.js 和 typescript.js,這兩個分別是 ts 的命令行和 api 的入口。

但是,這些是編譯以后的 js 代碼,源碼在 src 下,是用 ts 寫的。

怎么把編譯后的 js 代碼和 ts 源碼關聯起來呢?sourcemap!

默認編譯出來的產物是沒有 sourcemap 的,我們要修改下編譯配置:

修改下 src/tsconfig-library-base.json,(這是 ts 生成 lib 代碼的編譯配置)把 sourceMap 改為 true。

之后再編譯源碼:

  1. yarn  
  2. yarn run build:compiler 

然后就可以看到多了一個 built 目錄,下面有 tsc.js、typescript.js 這兩個入口文件,而且也有了 sourcemap:

接下來就可以直接調試 ts 源碼,而不是編譯后的 js 代碼了。信么?

不信我們來試試。

vscode 直接調試 ts

vscode 在項目根目錄下的 .vscode/launch.json 下保存調試配置:

我們添加一個調試配置:

  1.     "name""調試 ts 源碼"
  2.     "program""${workspaceFolder}/built/local/tsc.js"
  3.     "request""launch"
  4.     "skipFiles": [ 
  5.         "<node_internals>/**" 
  6.     ], 
  7.     "args": [ 
  8.         "./input.ts" 
  9.     ], 
  10.     "stopOnEntry"true
  11.     "type""node" 

含義如下:

  • name:調試配置的名字
  • program:調試的目標程序的地址
  • request:有 launch 和 attch 兩個取值,代表啟動新的還是連上已有的
  • skipFiles:調試的時候跳過一些文件,這里配置的是跳過 node 內部的那些文件,調用棧會更簡潔
  • args:命令行參數
  • stopOnEntry:是否在首行加個斷點
  • type:調試的類型,這里是用 node 來跑

保存之后就可以在調試面板看到該調試選項:

這里我們設計的 input.ts 是這樣的:

  1. type Test<T> = T extends boolean ? "Y" : "N"
  2.  
  3. type res = Test<number | boolean>; 

在 ts 的 checker.ts 部分打個斷點,然后點擊啟動調試。

然后,看,這斷住的地方,就是 ts 源碼啊,不是編譯后的 js 文件。這就是 sourcemap 的作用。

還可以在左邊文件樹看到源碼的目錄結構,這比調試編譯后的 js 代碼爽多了。

會了通過 sourcemap 調試源碼之后,我們該進入主題了:通過源碼探究分布式條件類型的實現原理。

其實我們上面使用的是 tsc.js 的命令行入口來調試的,這樣其實代碼比較多,很難理清要看哪部分代碼。怎么辦呢?

接下來就是我的秘密武器了,用 typescript compiler api。

typescript compiler api

ts 除了命令行工具的入口外,也提供了 api 的形式,只是我們很少用。但它對于探究 ts 源碼實現有很大的幫助。

我們定義個 test.js 文件,引入 typescript 的包:

  1. const ts = require("./built/local/typescript"); 

然后用 ts 的 api 傳入編譯配置,并 parse 源碼成 ast:

  1. const filename = "./input.ts"
  2. const program = ts.createProgram([filename], { 
  3.     allowJs: false 
  4. }); 
  5. const sourceFile = program.getSourceFile(filename); 

這里的 createProgram 第二個參數是編譯配置,我傳入了個 allowJS 意思了一下。

program.getSourceFile 返回的就是 ts 的 AST。

并且還可以拿到 typeChecker:

  1. const typeChecker = program.getTypeChecker(); 

然后呢?typeChecker 是類型檢查的 api,我們可以遍歷 AST 找到檢查的 node,然后調用 checker 的 api 進行檢查:

  1. function visitNode(node) { 
  2.     if (node.kind === ts.SyntaxKind.TypeReference)  { 
  3.         const type = typeChecker.getTypeFromTypeNode(node); 
  4.  
  5.         debugger; 
  6.     } 
  7.  
  8.     node.forEachChild(child => 
  9.         visitNode(child) 
  10.     ); 
  11.  
  12. visitNode(sourceFile); 

我們判斷了如果 AST 是 TypeReference 類型,則用 typeChecker.getTypeFromTypeNode 來解析類型。

接下來就可以精準的調試該類型解析的邏輯了,相比命令行的方式來說,更方便理清邏輯。

完整代碼如下:

  1. const ts = require("./built/local/typescript"); 
  2.  
  3. const filename = "./input.ts"
  4. const program = ts.createProgram([filename], { 
  5.     allowJs: false 
  6. }); 
  7. const sourceFile = program.getSourceFile(filename); 
  8. const typeChecker = program.getTypeChecker(); 
  9.  
  10. function visitNode(node) { 
  11.     if (node.kind === ts.SyntaxKind.TypeReference)  { 
  12.         const type = typeChecker.getTypeFromTypeNode(node); 
  13.  
  14.         debugger; 
  15.     } 
  16.  
  17.     node.forEachChild(child => 
  18.         visitNode(child) 
  19.     ); 
  20.  
  21. visitNode(sourceFile); 

我們改下調試配置,然后開始調試:

  1.     "name""調試 ts 源碼"
  2.     "program""${workspaceFolder}/test.js"
  3.     "request""launch"
  4.     "skipFiles": [ 
  5.         "<node_internals>/**" 
  6.     ], 
  7.     "args": [ 
  8.     ], 
  9.     "type""node" 

在 typeChecker.getTypeFromTypeNode 這行打個斷點,我們去看下具體的類型解析過程。

然后,XDM,打起精神,本文的高潮部分來了:

我們進入了 getTypeFromTypeNode 方法,這個方法就是根據 AST 的類型來做不同的解析,返回類型對象的。各種類型解析的邏輯都是從這里進入的,這是一個重要的交通樞紐。

然后我們進入了 TypeReference 的分支,因為 Test<number | boolean> 就是一個類型引用嘛。

TypeReference 的類型就是它引用的類型,它引用了 ConditionType,所以會再解析 T extends boolean 這個 ConditionType 的類型:

所有的類型都是按照 ast node 的 id 存入一個 nodeLinks 的 map 中來緩存,只有第一次需要解析,之后直接拿結果。比如上圖的 resolvedType 就存入了 nodeLinks 來緩存。

然后,XDM,看到閃閃發光的那行代碼了么?

解析 ConditionType 的類型的時候會根據 checkType 部分是否是類型參數(TypeParameter,也就是泛型)來設置 isDistributive 屬性。

之后解析 TypeReference 類型的時候,會傳入具體的類型來實例化:

這里就判斷了 conditionType 的 isDistributive 屬性,如果是,則把 unionType 的每個類型分別傳入來解析,最后合并返回。

如圖,我們走到了 isDistributive 為 true 的這個分支。

那么解析出的類型就是 'Y' | 'N' 的聯合類型。

那我們把 input.ts 代碼改一下呢:

  1. type Test<T> = [T] extends [boolean] ? "Y" : "N"
  2.  
  3. type res = Test<number | boolean>; 

checkType 不直接寫類型參數 T 了。

再跑一次:

這次沒進去了。

難道說?

確實,這樣的結果就是 N。

說明了什么?說明了 ConditionType 是根據 checkType 是否是類型參數來設置了 isDistributive 屬性,之后解析 TypeReference 的時候根據 isDistributive 的值分別做了不同的解析。

那么只要 checkType 不是 T 就行了。

所以這樣也行:

這樣也行:

我們經常用 [T] 來避免 distributive 只不過這樣比較簡潔,看完源碼我們知道了,其實別的方式也行。

就這樣,我們通過源碼理清了這個語法的實現原理。

總結

我們以探究 distributive condition type 的實現原理為目的來閱讀了 typescript 源碼。

首先把 typescript 源碼下載下來,然后改下編譯配置,生成帶有 sourcemap 的代碼,之后在 vscode 里調試,這樣可以直接調試編譯前的源碼,信息更多。

typescript 有 cli 和 api 兩種入口,用 cli 的方式無關代碼太多,比較難理清,所以我們用 api 的方式來寫了一段測試代碼,之后打斷點來調試。

ts 的類型信息保存在類型對象中,這個可以用 astexplorer.net 來可視化的查看。

用 typeChecker.getTypeFromTypeNode 可以拿到某個類型的具體值,我們就是通過這個作為入口來探究各種類型的解析邏輯。

源碼中比較重要的有這么幾點:

  • getTypeFromTypeNode 方法是通過 node 獲取類型的入口方法,所有 AST 的類型對象都是通過這個方法拿到
  • nodeLinks 保存了解析后的類型,key 為 node id,這樣解析一遍就好了,下次拿緩存。

之后我們看了 ConditionType 的解析邏輯會根據 checkType 是否為類型參數來設置 isDistributive 屬性,然后 TypeReference 實例化該類型的時候會根據 isDistributive 的值進入不同的處理邏輯,這就是它的實現原理。

理解了原理之后,我們再使用 distributive condition type 就心里有底了,還可以創造很多變形使用,不局限于 [T]。

本文以調試一個類型解析邏輯的原理為抓手探究了 ts 源碼閱讀方式,調試 ts 別的部分的代碼,或者調試其他的庫也是類似的。

希望可以幫助大家掌握 typescript 源碼調試技巧,想探究某個類型語法實現原理的時候,可以通過源碼層面來徹底搞清楚。源碼面前,沒有秘密。

 

責任編輯:武曉燕 來源: 神光的編程秘籍
相關推薦

2025-05-16 09:34:10

2017-10-24 14:57:58

AI人工智能機器學習

2018-03-19 14:43:28

2023-12-11 21:59:01

時序分析深度學習自回歸模型

2023-09-11 08:51:23

LinkedList雙向鏈表線程

2019-12-04 07:57:22

6G5G網絡

2019-07-21 08:10:21

技術研發優化

2017-12-08 10:42:49

HBase切分細節

2022-03-02 10:36:37

Linux性能優化

2017-08-28 16:40:07

Region切分觸發策略

2020-10-12 14:00:52

美的集團永洪科技

2025-09-16 09:05:00

2017-02-24 12:29:20

Android Thi開發板硬件

2018-11-28 10:39:01

5G網絡運營商

2024-07-02 11:16:21

2018-04-26 16:15:02

數據庫MySQLMySQL 8.0

2021-07-01 09:00:00

安全數字化轉型滲透

2019-12-31 10:08:35

架構模式軟件

2022-11-28 08:44:46

死鎖面試線程

2016-05-20 11:26:54

客戶端優化 直播推流
點贊
收藏

51CTO技術棧公眾號

欧美成人久久久| 日韩欧美亚洲一二三区| 成人18视频| 五月天婷婷网站| 久久99久久人婷婷精品综合| 欧美色图天堂网| 五月天在线免费视频| 在线观看xxx| 狠狠色综合色综合网络| 午夜精品久久久久久久99热浪潮 | 亚洲国产一二三精品无码| 色欲av永久无码精品无码蜜桃| 久久婷婷一区| 欧美二区在线播放| 欧美丰满美乳xxⅹ高潮www| 香港久久久电影| 欧美在线免费观看亚洲| 国产欧美精品aaaaaa片| 爱久久·www| 成人97人人超碰人人99| 国产精选久久久久久| 国产一卡二卡在线| 欧美精品不卡| 一道本无吗dⅴd在线播放一区| 国产亚洲精品成人a| 日韩一区精品| 一本色道久久综合狠狠躁的推荐| 天天想你在线观看完整版电影免费| 西西人体44www大胆无码| 国产真实乱子伦精品视频| 日本在线精品视频| 国产精品变态另类虐交| 香蕉视频国产精品| 最近2019年手机中文字幕 | 日韩欧美四区| 日韩精品专区在线| av在线网站免费观看| 国产精品久久久久久久久免费高清 | 亚洲一级网站| 美日韩精品免费视频| 亚洲女人毛茸茸高潮| 国产欧美日韩在线观看视频| 亚洲成人在线网| 香蕉在线观看视频| 日韩精品一区二区三区中文在线| 欧美日韩精品三区| 奇米影音第四色| 九九热线视频只有这里最精品| 亚洲国产精品一区二区尤物区| 日本女人高潮视频| 国产黄色在线网站| 亚洲欧美日韩一区二区三区在线观看| 亚洲午夜高清视频| 日本在线视频网| 国产精品嫩草影院com| 午夜精品区一区二区三| 阿v免费在线观看| 国产精品久久久久久妇女6080| 亚洲激情啪啪| 婷婷视频在线| 亚洲免费观看视频| 国产精品国三级国产av| 黄色aa久久| 午夜精品久久久久久| 成 年 人 黄 色 大 片大 全| 国产乱码在线| 婷婷久久综合九色综合绿巨人| 国产精品999视频| 在线最新版中文在线| 一本高清dvd不卡在线观看| 青青青国产在线视频| 成人黄色图片网站| 91精品国产综合久久香蕉的特点| 交换做爰国语对白| 果冻天美麻豆一区二区国产| 精品成人一区二区| 国产又爽又黄无码无遮挡在线观看| 日韩美女国产精品| 在线观看成人黄色| 国产suv精品一区二区68| 欧美欧美天天天天操| 91av视频在线| 中文字幕在线观看1| 国产乱人伦精品一区二区在线观看 | 色偷偷偷亚洲综合网另类| 成人免费视频国产免费观看| 亚洲国产99| 国产精品久久久久久av| 99视频国产精品免费观看a| 成人国产免费视频| 色综合视频二区偷拍在线| a级影片在线| 欧美性精品220| 中文字幕第22页| 牛牛影视久久网| 中文字幕亚洲自拍| 久久久无码一区二区三区| 三级一区在线视频先锋| 亚洲最大的av网站| 欧美亚洲日本| 亚洲人成7777| 蜜臀视频一区二区三区| 日韩区欧美区| 亚洲性69xxxbbb| 精品无码黑人又粗又大又长| 奇米色一区二区三区四区| 都市激情久久久久久久久久久| 精品欧美不卡一区二区在线观看| 亚洲精品视频在线观看免费| 日韩视频免费在线播放| 超碰成人97| 久久av中文字幕| 最近中文字幕在线免费观看| www..com久久爱| 特级西西444| 久久免费影院| 亚洲午夜未满十八勿入免费观看全集 | 国产av人人夜夜澡人人爽| 亚洲欧美日本国产| 色妞欧美日韩在线| 亚洲成人av影片| av电影天堂一区二区在线 | 99热这里只有精品8| 91久久久久久久久久久久久| 玖玖综合伊人| 五月婷婷色综合| aaa黄色大片| 最新精品国产| 91欧美激情另类亚洲| 成人在线观看黄色| 日韩欧美视频一区二区三区| 日韩精品人妻中文字幕有码| 欧美特黄一区| 成人欧美一区二区三区黑人免费| 久热国产在线| 欧美日韩高清一区二区不卡| 久久久久99精品成人| 蜜乳av另类精品一区二区| 麻豆亚洲一区| 中文日产幕无线码一区二区| 亚洲国内精品在线| 国产亚洲精品成人| 国产成人午夜精品影院观看视频| 青春草在线视频免费观看| 在线播放成人| 免费97视频在线精品国自产拍| 91成年人视频| 亚洲视频一二三| 91欧美一区二区三区| 99久久综合狠狠综合久久aⅴ| 国产精品午夜一区二区欲梦| 91视频在线观看| 欧美猛男超大videosgay| 欧美性受xxxx黑人| 美女国产一区二区三区| 尤物一区二区三区| 豆花视频一区| 欧美激情视频网站| 天天色天天操天天射| 精品露脸国产偷人在视频| 免费中文字幕av| 六月丁香综合| 亚洲视频在线二区| 日本亚洲视频| 97视频在线观看免费| 亚洲日本香蕉视频| 色综合久久88色综合天天免费| 伊人网在线视频观看| 青青草成人在线观看| 波多野结衣三级在线| 视频一区中文字幕精品| 91国内产香蕉| www.中文字幕久久久| 制服丝袜中文字幕一区| 青青草成人免费| 成+人+亚洲+综合天堂| 日本三区在线观看| 久久精品免费一区二区三区| 国产一区二区中文字幕免费看| 亚洲高清黄色| 欧美精品在线免费| 三级做a全过程在线观看| 欧美日韩成人综合| 国产一级在线观看视频| 国产日韩v精品一区二区| 亚洲在线观看网站| 蜜桃伊人久久| www.国产二区| 精品免费一区二区| 91蜜桃网站免费观看| 超级碰碰久久| 欧美成人激情图片网| 天堂√在线中文官网在线| 欧美猛男超大videosgay| 日韩欧美亚洲一区二区三区| 国产精品午夜在线观看| 白嫩情侣偷拍呻吟刺激| 麻豆一区二区三| 欧美 日韩 国产 高清| 91亚洲国产成人久久精品| 精品国产_亚洲人成在线| 亚洲午夜剧场| 热门国产精品亚洲第一区在线| 看女生喷水的网站在线观看| 国产视频在线观看一区二区| 国产毛片毛片毛片毛片毛片| 色偷偷88欧美精品久久久| 久久久久久久中文字幕| 中文av字幕一区| 激情综合丁香五月| 国产成人综合网站| 中文字幕第38页| 石原莉奈在线亚洲三区| 亚洲色成人www永久在线观看| 欧美日韩中字| 久久一区二区三区av| 亚洲综合色婷婷在线观看| 国产精品中文字幕在线观看| 松下纱荣子在线观看| 欧美激情伊人电影| 黄色网在线免费看| 中文字幕成人在线| 九色在线视频| 日韩精品福利网站| 丰满人妻av一区二区三区| 欧美精品日韩一区| 中文字幕免费播放| 欧洲精品一区二区| 狠狠人妻久久久久久综合| 午夜一区二区三区视频| 欧美成人国产精品高潮| 亚洲摸摸操操av| 26uuu成人网| 亚洲欧美日韩久久| 午夜爱爱毛片xxxx视频免费看| 国产精品视频免费| 五月天婷婷丁香网| 国产精品久久毛片| 国产wwwwxxxx| 中文字幕在线观看一区二区| 日韩av片在线免费观看| 国产欧美一区二区三区鸳鸯浴| 久久久精品人妻无码专区| 91麻豆国产香蕉久久精品| 人妻在线日韩免费视频| 97久久超碰精品国产| 精品中文字幕在线播放| 91网站黄www| 免费视频91蜜桃| 中文文精品字幕一区二区| 亚洲激情图片网| 亚洲天堂精品视频| 国产又粗又硬又长又爽| 亚洲人吸女人奶水| 精品处破女学生| 岛国视频午夜一区免费在线观看| 中文字幕亚洲高清| 欧美性生交xxxxx久久久| 极品国产91在线网站| 欧美日韩视频专区在线播放| 国产精品九九九九| 日韩欧美在线一区二区三区| 亚洲av综合色区无码一区爱av | 高清av在线| 日日噜噜噜夜夜爽亚洲精品| 成人影欧美片| 久久青草精品视频免费观看| 综合另类专区| 国产伦精品免费视频| 欧美午夜在线播放| 精品国产乱码久久久久久丨区2区 精品国产乱码久久久久久蜜柚 | 在线视频 日韩| 久久久久国产免费免费| 亚洲国产精品一区二区久久hs| 亚洲乱码日产精品bd| 男人天堂中文字幕| 日本高清不卡视频| 97人妻精品一区二区三区| 精品噜噜噜噜久久久久久久久试看| 欧美性猛交 xxxx| 国产香蕉97碰碰久久人人| 成人在线app| 啪一啪鲁一鲁2019在线视频| 男人天堂久久| 激情伦成人综合小说| 成人情趣视频网站| aa视频在线播放| 免费视频一区二区| 成熟妇人a片免费看网站| 国产视频一区不卡| 久久久综合久久久| 在线观看国产91| 欧美一级淫片aaaaaa| 一道本无吗dⅴd在线播放一区| 色屁屁www国产馆在线观看| 日产精品久久久一区二区福利| 高清久久一区| 欧美二区在线| 欧美体内she精视频在线观看| 久久精品香蕉视频| 国产成人99久久亚洲综合精品| 免费一级做a爰片久久毛片潮| 一区二区三区在线免费观看| 波多野结衣视频在线看| 精品国产亚洲一区二区三区在线观看 | 中文字幕黄色片| 欧美成人猛片aaaaaaa| www免费网站在线观看| 91干在线观看| 超碰97久久国产精品牛牛| 国产四区在线观看| 欧美一级视频| 四虎国产精品免费| 精品国产乱码久久久久久鸭王1| 国产免费观看久久| 亚洲一区 视频| 欧美一二三区精品| 欧美成人高清在线| 国产精品久久久久久久久男| 日韩高清一级| 日本在线xxx| 成人av网址在线| 青青草成人免费| 欧美一区永久视频免费观看| yourporn在线观看视频| 热久久视久久精品18亚洲精品| 精品视频高潮| 精品成在人线av无码免费看| 国产一区二区剧情av在线| 99久久久无码国产精品不卡| 欧美午夜电影在线播放| 可以在线观看的av| 欧日韩不卡在线视频| 好吊妞视频这里有精品| 久草视频这里只有精品| 国产不卡免费视频| 欧美黑吊大战白妞| 日韩欧美电影一二三| 在线观看的网站你懂的| 91精品网站| 欧美日韩中文| 成人欧美精品一区二区| 亚洲成人精品影院| 欧美自拍第一页| 97精品欧美一区二区三区| 国产精东传媒成人av电影| 国产一区二区四区| av亚洲产国偷v产偷v自拍| 青青草av在线播放| 亚洲美女视频网| 欧美××××黑人××性爽| 日本一区免费在线观看| 日本欧美韩国一区三区| 91狠狠综合久久久久久| 欧美伦理视频网站| 超鹏97在线| 国产精品亚洲一区| 国产亚洲福利| 手机看片日韩av| 欧美日韩成人激情| 51xtv成人影院| 国产在线资源一区| 久久精品男女| 美女网站视频色| 精品免费国产一区二区三区四区| 国模私拍一区二区国模曼安| 欧美一区三区二区在线观看| 蜜臀av性久久久久蜜臀aⅴ流畅| 韩国一级黄色录像| 欧美xxxx在线观看| 亚洲欧美se| 亚洲综合欧美日韩| 国产91精品在线观看| av黄色在线播放| 日韩日本欧美亚洲| 91精品啪在线观看国产手机| 99999精品视频| 亚洲欧洲美洲综合色网| 欧美性受xxxx狂喷水| 国产精品91久久久久久| 欧美日韩蜜桃| 国产jk精品白丝av在线观看| 日韩一区二区三区免费看| 色资源二区在线视频| 一区二区三区在线视频看| 成人av网址在线| 国产又粗又长视频| 97视频在线播放| 亚洲精品a级片| 国产精品扒开腿做爽爽| 69p69国产精品| 正在播放日韩精品| 日本女人高潮视频| 久久蜜桃av一区精品变态类天堂 | 精品免费视频.| 欧美aaa大片视频一二区| av日韩在线看| 国产精品免费丝袜| 无码国产伦一区二区三区视频| 国产精品一区二区三区免费视频|