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

你不知道的 TypeScript 高級類型

開發 前端
如果只是掌握了 TypeScript 的一些基礎類型,可能很難游刃有余的去使用 TypeScript,而且最近 TypeScript 發布了 4.0 的版本新增了更多功能,想要用好它只能不斷的學習和掌握它。

[[342075]]

 前言

對于有 JavaScript 基礎的同學來說,入門 TypeScript 其實很容易,只需要簡單掌握其基礎的類型系統就可以逐步將 JS 應用過渡到 TS 應用。

  1. // js 
  2. const double = (num) => 2 * num 
  3.  
  4. // ts 
  5. const double = (num: number): number => 2 * num 

然而,當應用越來越復雜,我們很容易把一些變量設置為 any 類型,TypeScript 寫著寫著也就成了 AnyScript。為了讓大家能更加深入的了解 TypeScript 的類型系統,本文將重點介紹其高級類型,幫助大家擺脫 AnyScript。

泛型

在講解高級類型之前,我們需要先簡單理解泛型是什么。

泛型是強類型語言中比較重要的一個概念,合理的使用泛型可以提升代碼的可復用性,讓系統更加靈活。下面是維基百科對泛型的描述:

泛型允許程序員在強類型程序設計語言中編寫代碼時使用一些以后才指定的類型,在實例化時作為參數指明這些類型。

泛型通過一對尖括號來表示(<>),尖括號內的字符被稱為類型變量,這個變量用來表示類型。

  1. function copy<T>(arg: T): T { 
  2.   if (typeof arg === 'object') { 
  3.     return JSON.parse( 
  4.       JSON.stringify(arg) 
  5.     ) 
  6.   } else { 
  7.     return arg 
  8.   } 

這個類型 T,在沒有調用 copy 函數的時候并不確定,只有調用 copy 的時候,我們才知道 T 具體代表什么類型。

  1. const str = copy<string>('my name is typescript'

類型

我們在 VS Code 中可以看到 copy 函數的參數以及返回值已經有了類型,也就是說我們調用 copy 函數的時候,給類型變量 T 賦值了 string。其實,我們在調用 copy 的時候可以省略尖括號,通過 TS 的類型推導是可以確定 T 為 string 的。

類型推導

高級類型

除了 string、number、boolean 這種基礎類型外,我們還應該了解一些類型聲明中的一些高級用法。

交叉類型(&)

交叉類型說簡單點就是將多個類型合并成一個類型,個人感覺叫做「合并類型」更合理一點,其語法規則和邏輯 “與” 的符號一致。

  1. T & U 

假如,我現在有兩個類,一個按鈕,一個超鏈接,現在我需要一個帶有超鏈接的按鈕,就可以使用交叉類型來實現。

  1. interface Button { 
  2.   type: string 
  3.   text: string 
  4.  
  5. interface Link { 
  6.   alt: string 
  7.   href: string 
  8.  
  9. const linkBtn: Button & Link = { 
  10.   type: 'danger'
  11.   text: '跳轉到百度'
  12.   alt: '跳轉到百度'
  13.   href: 'http://www.baidu.com' 

聯合類型(|)

聯合類型的語法規則和邏輯 “或” 的符號一致,表示其類型為連接的多個類型中的任意一個。

  1. T | U 

例如,之前的 Button 組件,我們的 type 屬性只能指定固定的幾種字符串。

  1. interface Button { 
  2.   type: 'default' | 'primary' | 'danger' 
  3.   text: string 
  4.  
  5. const btn: Button = { 
  6.   type: 'primary'
  7.   text: '按鈕' 

類型別名(type)

前面提到的交叉類型與聯合類型如果有多個地方需要使用,就需要通過類型別名的方式,給這兩種類型聲明一個別名。類型別名與聲明變量的語法類似,只需要把 const、let 換成 type 關鍵字即可。

  1. type Alias = T | U 
  2. type InnerType = 'default' | 'primary' | 'danger' 
  3.  
  4. interface Button { 
  5.   type: InnerType 
  6.   text: string 
  7.  
  8. interface Alert { 
  9.   type: ButtonType 
  10.   text: string 

類型索引(keyof)

keyof 類似于 Object.keys ,用于獲取一個接口中 Key 的聯合類型。

  1. interface Button { 
  2.     type: string 
  3.     text: string 
  4.  
  5. type ButtonKeys = keyof Button 
  6. // 等效于 
  7. type ButtonKeys = "type" | "text" 

還是拿之前的 Button 類來舉例,Button 的 type 類型來自于另一個類 ButtonTypes,按照之前的寫法,每次 ButtonTypes 更新都需要修改 Button 類,如果我們使用 keyof 就不會有這個煩惱。

  1. interface ButtonStyle { 
  2.     color: string 
  3.     background: string 
  4. interface ButtonTypes { 
  5.     default: ButtonStyle 
  6.     primary: ButtonStyle 
  7.     danger: ButtonStyle 
  8. interface Button { 
  9.     type: 'default' | 'primary' | 'danger' 
  10.     text: string 
  11.  
  12. // 使用 keyof 后,ButtonTypes修改后,type 類型會自動修改  
  13. interface Button { 
  14.     type: keyof ButtonTypes 
  15.     text: string 

類型約束(extends)

這里的 extends 關鍵詞不同于在 class 后使用 extends 的繼承作用,泛型內使用的主要作用是對泛型加以約束。我們用我們前面寫過的 copy 方法再舉個例子:

  1. type BaseType = string | number | boolean 
  2.  
  3. // 這里表示 copy 的參數 
  4. // 只能是字符串、數字、布爾這幾種基礎類型 
  5. function copy<T extends BaseType>(arg: T): T { 
  6.   return arg 

copy number

如果我們傳入一個對象就會有問題。

copy object

 

extends 經常與 keyof 一起使用,例如我們有一個方法專門用來獲取對象的值,但是這個對象并不確定,我們就可以使用 extends 和 keyof 進行約束。

  1. function getValue<T, K extends keyof T>(obj: T, key: K) { 
  2.   return obj[key
  3.  
  4. const obj = { a: 1 } 
  5. const a = getValue(obj, 'a'

獲取對象的值

這里的 getValue 方法就能根據傳入的參數 obj 來約束 key 的值。

類型映射(in)

in 關鍵詞的作用主要是做類型的映射,遍歷已有接口的 key 或者是遍歷聯合類型。下面使用內置的泛型接口 Readonly 來舉例。

  1. type Readonly<T> = { 
  2.     readonly [P in keyof T]: T[P]; 
  3. }; 
  4.  
  5. interface Obj { 
  6.   a: string 
  7.   b: string 
  8.  
  9. type ReadOnlyObj = Readonly<Obj> 

ReadOnlyObj

我們可以結構下這個邏輯,首先 keyof Obj 得到一個聯合類型 'a' | 'b'。

  1. interface Obj { 
  2.     a: string 
  3.     b: string 
  4.  
  5. type ObjKeys = 'a' | 'b' 
  6.  
  7. type ReadOnlyObj = { 
  8.     readonly [P in ObjKeys]: Obj[P]; 

然后 P in ObjKeys 相當于執行了一次 forEach 的邏輯,遍歷 'a' | 'b'

  1. type ReadOnlyObj = { 
  2.     readonly a: Obj['a']; 
  3.     readonly b: Obj['b']; 

最后就可以得到一個新的接口。

  1. interface ReadOnlyObj { 
  2.     readonly a: string; 
  3.     readonly b: string; 

條件類型(U ? X : Y)

條件類型的語法規則和三元表達式一致,經常用于一些類型不確定的情況。

  1. T extends U ? X : Y 

上面的意思就是,如果 T 是 U 的子集,就是類型 X,否則為類型 Y。下面使用內置的泛型接口 Extract 來舉例。

  1. type Extract<T, U> = T extends U ? T : never; 

如果 T 中的類型在 U 存在,則返回,否則拋棄。假設我們兩個類,有三個公共的屬性,可以通過 Extract 提取這三個公共屬性。

  1. interface Worker { 
  2.   name: string 
  3.   age: number 
  4.   email: string 
  5.   salary: number 
  6.  
  7. interface Student { 
  8.   name: string 
  9.   age: number 
  10.   email: string 
  11.   grade: number 
  12.  
  13.  
  14. type CommonKeys = Extract<keyof Worker, keyof Student> 
  15. // 'name' | 'age' | 'email' 

CommonKeys

工具泛型

TypesScript 中內置了很多工具泛型,前面介紹過 Readonly、Extract 這兩種,內置的泛型在 TypeScript 內置的 lib.es5.d.ts 中都有定義,所以不需要任何依賴都是可以直接使用的。下面看看一些經常使用的工具泛型吧。

lib.es5.d.ts

Partial

  1. type Partial<T> = { 
  2.     [P in keyof T]?: T[P] 

Partial 用于將一個接口的所有屬性設置為可選狀態,首先通過 keyof T,取出類型變量 T 的所有屬性,然后通過 in 進行遍歷,最后在屬性后加上一個 ?。

我們通過 TypeScript 寫 React 的組件的時候,如果組件的屬性都有默認值的存在,我們就可以通過 Partial 將屬性值都變成可選值。

  1. import React from 'react' 
  2.  
  3. interface ButtonProps { 
  4.   type: 'button' | 'submit' | 'reset' 
  5.   text: string 
  6.   disabled: boolean 
  7.   onClick: () => void 
  8.  
  9. // 將按鈕組件的 props 的屬性都改為可選 
  10. const render = (props: Partial<ButtonProps> = {}) => { 
  11.   const baseProps = { 
  12.     disabled: false
  13.     type: 'button'
  14.     text: 'Hello World'
  15.     onClick: () => {}, 
  16.   } 
  17.   const options = { ...baseProps, ...props } 
  18.   return ( 
  19.     <button 
  20.       type={options.type} 
  21.       disabled={options.disabled} 
  22.       onClick={options.onClick}> 
  23.       {options.text} 
  24.     </button> 
  25.   ) 

Required

  1. type Required<T> = { 
  2.     [P in keyof T]-?: T[P] 

Required 的作用剛好與 Partial 相反,就是將接口中所有可選的屬性改為必須的,區別就是把 Partial 里面的 ? 替換成了 -?。

Record

  1. type Record<K extends keyof any, T> = { 
  2.     [P in K]: T 

Record 接受兩個類型變量,Record 生成的類型具有類型 K 中存在的屬性,值為類型 T。這里有一個比較疑惑的點就是給類型 K 加一個類型約束,extends keyof any,我們可以先看看 keyof any 是個什么東西。

keyof any

大致一直就是類型 K 被約束在 string | number | symbol 中,剛好就是對象的索引的類型,也就是類型 K 只能指定為這幾種類型。

我們在業務代碼中經常會構造某個對象的數組,但是數組不方便索引,所以我們有時候會把對象的某個字段拿出來作為索引,然后構造一個新的對象。假設有個商品列表的數組,要在商品列表中找到商品名為 「每日堅果」的商品,我們一般通過遍歷數組的方式來查找,比較繁瑣,為了方便,我們就會把這個數組改寫成對象。

  1. interface Goods { 
  2.   id: string 
  3.  name: string 
  4.   price: string 
  5.   image: string 
  6.  
  7. const goodsMap: Record<string, Goods> = {} 
  8. const goodsList: Goods[] = await fetch('server.com/goods/list'
  9.  
  10. goodsList.forEach(goods => { 
  11.   goodsMap[goods.name] = goods 
  12. }) 

Pick

  1. type Pick<T, K extends keyof T> = { 
  2.     [P in K]: T[P] 

Pick 主要用于提取接口的某幾個屬性。做過 Todo 工具的同學都知道,Todo工具只有編輯的時候才會填寫描述信息,預覽的時候只有標題和完成狀態,所以我們可以通過 Pick 工具,提取 Todo 接口的兩個屬性,生成一個新的類型 TodoPreview。

  1. interface Todo { 
  2.   title: string 
  3.   completed: boolean 
  4.   description: string 
  5.  
  6. type TodoPreview = Pick<Todo, "title" | "completed"
  7.  
  8. const todo: TodoPreview = { 
  9.   title: 'Clean room'
  10.   completed: false 

TodoPreview

Exclude

  1. type Exclude<T, U> = T extends U ? never : T 

Exclude 的作用與之前介紹過的 Extract 剛好相反,如果 T 中的類型在 U 不存在,則返回,否則拋棄。現在我們那之前的兩個類舉例,看看 Exclude 的返回結果。

  1. interface Worker { 
  2.   name: string 
  3.   age: number 
  4.   email: string 
  5.   salary: number 
  6.  
  7. interface Student { 
  8.   name: string 
  9.   age: number 
  10.   email: string 
  11.   grade: number 
  12.  
  13.  
  14. type ExcludeKeys = Exclude<keyof Worker, keyof Student> 
  15. // 'name' | 'age' | 'email' 

ExcludeKeys

取出的是 Worker 在 Student 中不存在的 salary。

Omit

  1. type Omit<T, K extends keyof any> = Pick< 
  2.   T, Exclude<keyof T, K> 

Omit 的作用剛好和 Pick 相反,先通過 Exclude 先取出類型 T 中存在,但是 K 不存在的屬性,然后再由這些屬性構造一個新的類型。還是通過前面的 Todo 案例來說,TodoPreview 類型只需要排除接口的 description 屬性即可,寫法上比之前 Pick 精簡了一些。

  1. interface Todo { 
  2.   title: string 
  3.   completed: boolean 
  4.   description: string 
  5.  
  6. type TodoPreview = Omit<Todo, "description"
  7.  
  8. const todo: TodoPreview = { 
  9.   title: 'Clean room'
  10.   completed: false 

TodoPreview

總結

如果只是掌握了 TypeScript 的一些基礎類型,可能很難游刃有余的去使用 TypeScript,而且最近 TypeScript 發布了 4.0 的版本新增了更多功能,想要用好它只能不斷的學習和掌握它。希望閱讀本文的朋友都能有所收獲,擺脫 AnyScript。

本文轉載自微信公眾號「更了不起的前端」,可以通過以下二維碼關注。轉載本文請聯系更了不起的前端公眾號。

 

責任編輯:武曉燕 來源: 更了不起的前端
相關推薦

2021-10-17 13:10:56

函數TypeScript泛型

2020-06-12 09:20:33

前端Blob字符串

2020-07-28 08:26:34

WebSocket瀏覽器

2020-08-05 12:17:00

C語言代碼分配

2022-08-10 09:03:35

TypeScript前端

2009-12-10 09:37:43

2022-10-13 11:48:37

Web共享機制操作系統

2021-02-01 23:23:39

FiddlerCharlesWeb

2011-09-15 17:10:41

2010-08-23 09:56:09

Java性能監控

2021-07-05 05:34:10

Typescript語言開發

2022-11-04 08:19:18

gRPC框架項目

2021-12-29 11:38:59

JS前端沙箱

2021-12-22 09:08:39

JSON.stringJavaScript字符串

2015-06-19 13:54:49

2020-08-11 11:20:49

Linux命令使用技巧

2012-11-23 10:57:44

Shell

2020-03-16 16:20:03

less查看文件Linux

2019-11-20 10:25:06

sudoLinux

2017-03-02 14:05:42

AndroidAndroid Stu調試技巧
點贊
收藏

51CTO技術棧公眾號

国产精品久久久久久久久| 日韩国产精品视频| 成人午夜视频免费观看| 高清一区二区三区四区| 亚洲女人av| 日韩视频永久免费观看| 国产av一区二区三区传媒| 日韩在线伦理| 中文字幕在线观看不卡视频| 俄罗斯精品一区二区| 99精品在线播放| 亚洲一级淫片| 亚洲欧美日韩国产精品| 欧美激情第四页| 日韩三级影视| 亚洲成人动漫av| 亚洲一区尤物| 欧美成人综合在线| 懂色一区二区三区免费观看| 国产精品偷伦视频免费观看国产| 久久精品国产亚洲AV无码男同 | 欧美日韩一区二区三区高清| 免费网站在线观看视频| 色大18成网站www在线观看| 91色在线porny| 3d精品h动漫啪啪一区二区| 波多野结衣高清在线| 99精品热视频只有精品10| 久久精品99久久久香蕉| 黄色片网站免费| 亚洲动漫精品| 欧美va在线播放| www.成年人| 69堂精品视频在线播放| 欧美日韩国产丝袜另类| 高清无码视频直接看| 老司机精品视频在线观看6| 久久久久99精品国产片| 精品福利影视| 人妻夜夜爽天天爽| 国产成人欧美日韩在线电影| 国产欧美日韩精品丝袜高跟鞋| 午夜婷婷在线观看| 亚洲综合精品四区| 国内精品久久影院| 欧美黄色免费在线观看| 婷婷精品进入| 丝袜美腿亚洲一区二区| 日本精品在线观看视频| 欧美日韩123| 亚洲欧美国产另类| 免费观看一级一片| 亚洲免费专区| 亚洲欧洲日本专区| 久久久久久久久久久久| 午夜a一级毛片亚洲欧洲| 日韩av影视综合网| 香蕉网在线播放| 无码少妇一区二区三区| 亚洲女人天堂av| 中文字幕丰满孑伦无码专区| 美女主播精品视频一二三四| 亚洲国产精品视频在线观看| 中文字幕精品视频在线| 清纯唯美亚洲经典中文字幕| 亚洲免费精彩视频| 色欲AV无码精品一区二区久久| 欧美女王vk| 最近2019中文字幕mv免费看| 日本一级片免费| 综合色一区二区| 欧美极品少妇xxxxⅹ免费视频| 久久免费精彩视频| 一本色道88久久加勒比精品| 国产91精品久| 中文字幕在线播放日韩| 精品亚洲国内自在自线福利| 亚洲一区二区三区成人在线视频精品| 亚洲av无码乱码国产精品久久| 成人免费观看男女羞羞视频| 久久艳妇乳肉豪妇荡乳av| 免费在线高清av| 国产精品系列在线| 一本大道东京热无码aⅴ| av丝袜在线| 欧美专区亚洲专区| 国产裸体视频网站| 日韩在线你懂的| 中文字幕av一区二区| 欧美日韩午夜视频| 国产日韩免费| 国产精品日日做人人爱| 国产激情视频在线播放| 91小视频在线免费看| 亚洲精品无人区| 男女视频在线| 欧美网站一区二区| 亚洲性图第一页| 国内黄色精品| 欧美激情欧美狂野欧美精品| 色av性av丰满av| 国产老妇另类xxxxx| 精品久久久久久一区二区里番| a√资源在线| 亚洲制服丝袜av| 成人性生生活性生交12| 一区二区三区国产好| 亚洲天堂av图片| 久久免费视频精品| 美女网站色91| 狼狼综合久久久久综合网| 免费日本一区二区三区视频| 精品国产91久久久久久| 亚洲无在线观看| 国产亚洲电影| 久久久噜噜噜久久久| 伊人22222| 91网站黄www| 青青草综合在线| www.一区| 亚洲欧美日韩网| 国产福利久久久| 国产主播一区二区| 日韩高清国产精品| 手机av在线| 欧美α欧美αv大片| 日韩欧美视频免费观看| 免费精品视频| 国内视频一区二区| 色呦呦在线看| 欧美一区二区免费| 亚洲高潮女人毛茸茸| 先锋影音久久久| 精品高清视频| 蜜桃视频在线观看免费视频| 精品少妇一区二区三区免费观看| 国产一区第一页| 麻豆精品国产传媒mv男同| 欧美日韩精品久久| 中文字幕成在线观看| 精品国产污污免费网站入口| 中文字幕五月天| 激情综合网天天干| 国产成年人在线观看| 日韩精品第二页| 色婷婷综合成人| 亚洲综合免费视频| 国产精品久久久爽爽爽麻豆色哟哟 | 丁香在线视频| 欧美在线一区二区| 级毛片内射视频| 日产国产欧美视频一区精品| 日韩欧美一区二区视频在线播放 | 日韩香蕉视频| 国语精品中文字幕| 男人久久天堂| 国产午夜精品理论片a级探花| 精品美女久久久久| 久久亚洲免费视频| 日本三区在线观看| 国产在视频线精品视频www666| 国产成人自拍视频在线观看| 国产高清视频在线| 欧美日韩亚洲综合一区| 一区二区三区影视| 国产成人精品一区二区三区四区 | 麻豆理论在线观看| 亚洲少妇激情视频| 一本大道伊人av久久综合| 一区二区中文字幕在线| 亚洲v在线观看| 亚洲深夜影院| 亚洲 国产 欧美一区| 四虎精品在线观看| 欧美激情一级二级| 三级无遮挡在线观看| 在线观看区一区二| 污污的视频在线免费观看| 国产传媒一区在线| 成人在线免费观看av| 色天天久久综合婷婷女18| 91免费版网站入口| 国产传媒av在线| 国产亚洲成精品久久| 国产三区在线播放| 午夜免费久久看| 亚洲ⅴ国产v天堂a无码二区| 韩国视频一区二区| 日本十八禁视频无遮挡| blacked蜜桃精品一区| 亚洲一区二区少妇| 亚洲精品88| 久久福利视频网| 少妇性bbb搡bbb爽爽爽欧美| 欧美精品一级二级| 六月丁香在线视频| 亚洲欧洲av另类| 30一40一50老女人毛片| 国产麻豆精品95视频| 青青视频在线播放| 午夜精品影院| 午夜精品亚洲一区二区三区嫩草| 91综合精品国产丝袜长腿久久| 国产91免费观看| 成人在线免费观看黄色| 中文字幕亚洲图片| 天堂av在线免费观看| 3d动漫精品啪啪一区二区竹菊| av大片在线免费观看| 亚洲精品欧美激情| 美女100%露胸无遮挡| 99久久精品免费看| 超碰在线免费av| 天堂影院一区二区| 分分操这里只有精品| 中文字幕免费一区二区| 天堂精品视频| 亚洲另类春色校园小说| 国产精品日韩一区二区免费视频| 亚洲福利影视| 国产精品扒开腿做爽爽爽的视频| av在线加勒比| 欧美极品少妇xxxxⅹ裸体艺术| 欧美日本一道| 尤物tv国产一区| 欧美香蕉爽爽人人爽| 亚洲电影成人av99爱色| 国产夫绿帽单男3p精品视频| 欧美日韩午夜精品| 五月天中文字幕| 色噜噜狠狠成人中文综合 | 欧美日韩免费高清一区色橹橹| 日韩精品成人一区| 亚洲一区二区精品久久av| 永久免费看片直接| 中文字幕字幕中文在线中不卡视频| 蜜桃无码一区二区三区| 91在线观看污| 中文字幕无码人妻少妇免费| 国产·精品毛片| 少妇愉情理伦片bd| 国产主播一区二区| 成人免费播放视频| 国产精品一区二区在线看| 在线免费看污网站| 国产自产2019最新不卡| 91网址在线观看精品| 国产在线日韩欧美| 永久看看免费大片| 高清免费成人av| 国产原创剧情av| 成人国产电影网| 人体私拍套图hdxxxx| 久久综合久久综合久久综合| 成人免费无遮挡无码黄漫视频| 久久婷婷国产综合精品青草 | 午夜福利一区二区三区| 亚洲激情视频网| 日本电影一区二区在线观看| 亚洲欧美精品suv| 国产系列在线观看| 中文字幕久久亚洲| 黄色网页网址在线免费| 欧美大片欧美激情性色a∨久久| 最新超碰在线| 久久久久亚洲精品国产 | 成人av色在线观看| 成人在线分类| 国产欧美日韩视频一区二区三区| 女一区二区三区| 热re99久久精品国产99热| 日韩av二区| 日韩国产小视频| 久久成人在线| 亚洲精品第三页| 成人黄色av网站在线| 国产一二三四五区| 亚洲视频狠狠干| 日本网站在线播放| 欧美制服丝袜第一页| 99久久婷婷国产一区二区三区 | 国产在线播放av| 久久九九热免费视频| 超碰资源在线| 国产男女猛烈无遮挡91| 国产 日韩 欧美 综合 一区| 日韩精品不卡| 欧美午夜精品| 久久久久国产精品熟女影院 | 久久丫精品国产亚洲av不卡| 中文幕一区二区三区久久蜜桃| 免费中文字幕在线观看| 在线看一区二区| 亚洲精品国产一区二| 亚洲偷熟乱区亚洲香蕉av| 天堂av资源在线观看| 国产成人中文字幕| 高潮久久久久久久久久久久久久| 日韩久久久久久久久久久久久| 欧美午夜不卡| 久久国产精品国产精品| 成人va在线观看| 老司机深夜福利网站| 欧美日韩国产中文精品字幕自在自线| 亚洲天堂视频在线| 日韩国产精品视频| 丝袜中文在线| 国产精品美女无圣光视频| 久久影院资源站| 国产一二三四五| 日韩福利视频导航| 三级黄色片网站| 亚洲欧美另类综合偷拍| 啪啪小视频网站| 日韩经典中文字幕| gogo久久| 成人av蜜桃| 在线精品小视频| 欧美日韩一区二区三区69堂| 久久综合九色综合久久久精品综合| 18岁成人毛片| 91精品在线观看入口| www.亚洲.com| 日韩av电影免费观看高清| gogo人体一区| 青青草视频国产| 国产一区二区三区四| 亚洲综合图片一区| 欧美亚洲综合另类| 国外av在线| 国产99久久久欧美黑人 | 亚洲欧美国产高清va在线播| 99riav视频在线观看| 国产二区一区| 国内综合精品午夜久久资源| 午夜免费福利网站| 中文字幕一区二区三区四区 | 久久精品国产av一区二区三区| 欧美一区二区三区视频在线观看| 午夜国产福利在线| 国产女精品视频网站免费| 久久麻豆精品| 国产无色aaa| 亚洲色图.com| 国产视频一二三四区| 毛片精品免费在线观看| 精品国产鲁一鲁****| 国产女主播av| 国产99一区视频免费| 国产一级特黄毛片| 亚洲国产精品va在看黑人| 免费一二一二在线视频| 精品一区久久久久久| 久久国产精品久久久久久电车 | 免费观看的毛片| 2019中文在线观看| 亚洲婷婷影院| 丝袜制服一区二区三区| 国产精品你懂的| 国产又大又长又粗| 欧美成人激情视频免费观看| 日韩一级淫片| 丰满少妇久久久| 久久免费视频一区| 中文字幕永久在线视频| 久热爱精品视频线路一| 1204国产成人精品视频| www.浪潮av.com| 日本一二三不卡| 国产视频一二三四区| 久久人人看视频| 欧美美女在线| 欧美日韩久久婷婷| 亚洲国产裸拍裸体视频在线观看乱了| 无码国精品一区二区免费蜜桃| 日本久久91av| 99久久亚洲精品| 亚洲一级Av无码毛片久久精品| 粉嫩老牛aⅴ一区二区三区| h视频在线播放| 国产chinese精品一区二区| 亚洲综合精品四区| 69夜色精品国产69乱| 亚洲激情在线观看视频免费| 最新日韩一区| 国产视频在线观看网站| av资源站一区| 亚洲一区二区三区网站| 久久久久久久成人| 狠狠色丁香婷婷综合影院| 亚洲丝袜在线观看| 色综合久久久久综合99| 黄色成人影院| 欧美一区二区三区在线播放| 国产酒店精品激情| 亚洲国产成人无码av在线| 欧美巨大黑人极品精男| 国产亚洲电影| 完美搭档在线观看| 欧美日韩国产另类不卡|