色综合老司机第九色激情 _中文字幕日韩av资源站_国产+人+亚洲_久久久精品影院_久久久视频免费观看_欧美激情亚洲自拍_亚洲成av人片在线观看香蕉_热草久综合在线_欧美极品第一页_2020国产精品自拍

千鋒教育-做有情懷、有良心、有品質的職業教育機構

手機站
千鋒教育

千鋒學習站 | 隨時隨地免費學

千鋒教育

掃一掃進入千鋒手機站

領取全套視頻
千鋒教育

關注千鋒學習站小程序
隨時隨地免費學習課程

當前位置:首頁  >  技術干貨  > 15個Typescript項目常用語法練習,學會它,90%的場景不害怕!(二)

15個Typescript項目常用語法練習,學會它,90%的場景不害怕!(二)

來源:千鋒教育
發布人:syq
時間: 2022-07-14 16:16:00 1657786560

  1.泛型 generics

/* 泛型 generics */

type UseState = <T>(v: T) => [T, (v: T) => void];

const useState: UseState = (v) => {
 return [
   v,
  (v) => {
     //...
  }
];
};

export const Component = () => {
 const [num, setNum] = useState(0); // OK
 const [str, setStr] = useState(""); // OK
 const [list, setList] = useState([1, 2, 3]); // OK

 // test
 const newNum = num + 1;
 setNum(newNum);

 const newStr = str.toUpperCase();
 setStr(newStr);

 const newList = list.slice(1);
 setList(newList);
};

Typescript項目常用語法

  2.部分對象 Partial

/* 部分對象 Partial */

interface User {
  name: string;
  age: number;
  occupation: string;
}

export const users: User[] = [
  {
    name: "Max Mustermann",
    age: 25,
    occupation: "Chimney sweep"
  },
  {
    name: "Wilson",
    age: 23,
    occupation: "Ball"
  }
];

type Criteria = {
  [Property in keyof User]?: User[Property];
};

// 等同于
// type Criteria = Partial<User>;

export const filterUsers = (users: User[], criteria: Criteria): User[] =>
  users.filter((user) => {
    const criteriaKeys = Object.keys(criteria) as (keyof Criteria)[];
    return criteriaKeys.every((fieldName) => {
      return user[fieldName] === criteria[fieldName];
    });
  });

const usersOfAge23 = filterUsers(users, {
  age: 23
});

  3.函數中 this 的使用

/* 函數中 this 的使用 */
// 參考 https://www.typescriptlang.org/docs/handbook/2/functions.html#declaring-this-in-a-function

export const debounce = <F extends (...args: any[]) => void>(
  fn: F,
  delay = 200
) => {
  let timeout = 0;
  return function (this: any, ...args: any[]) {
    timeout && clearTimeout(timeout);
    timeout = window.setTimeout(() => {
      fn.apply(this, args);
    }, delay);
  } as F;
};

  4.類型編程-從基礎類型構造新類型

/* 類型編程-從基礎類型構造新類型 */

export type CustomObject<K extends string | number, T> = { [key in K]: T };

// 1. 示例
// ObjectOfStringValue 對象的值只能為字符串類型
type ObjectOfStringValue = CustomObject<string, string>;
const objOfStringValue: ObjectOfStringValue = {
  h: "hello", // OK
  w: "world" // OK
};

// 2. ObjectOfStringValue
// ObjectOfStringValue 對象的值只能為數字類型
type ObjectOfNumberValue = CustomObject<string, number>;
const objOfNumberValue: ObjectOfNumberValue = {
  a: 100, // OK
  b: 100 // OK
};
const a = objOfNumberValue.a;

// 3. ObjectOfUserValue
type User = {
  username: string;
  age: number;
};

// ObjectOfUserValue 對象的值只能為User類型
type ObjectOfUserValue = CustomObject<string, User>;

const objOfUserValue: ObjectOfUserValue = {
  u1: {
    username: "xiaoming",
    age: 18
  }
};
const { username } = objOfUserValue.u1;

  5.對象類型的繼承

/* 對象類型的繼承 */

export interface Response {
  data: any;
  status: number;
  statusText: string;
}

// 1. Response 類型的基礎上添加 config 屬性
export interface ResponseWithConfig extends Response {
  config: any;
}
const responseWithConfig: ResponseWithConfig = {
  data: 100,
  status: 0,
  statusText: "success",
  config: {}
};

// 2. Response 類型的基礎上改寫 data 屬性類型
export interface StringResponse extends Response {
  data: string;
}
const stringResponse: StringResponse = {
  data: "100",
  status: 0,
  statusText: "success"
};

  6.對象類型的修改

/* 對象類型的修改 */
/* extends可以繼承對象類型,但不可與原類型沖突,此時可以先使用 Omit 去除需要修改的屬性 */

export interface TreeNode {
  id: number;
  value: number;
  children?: TreeNode[];
}

// 1. 去除 TreeNode id 屬性同時修改 children 屬性的類型
export interface NodeWithoutId extends Omit<TreeNode, "id" | "children"> {
  children?: NodeWithoutId[];
}

// OK
const nodeWithoutId: NodeWithoutId = {
  value: 1,
  children: [
    {
      value: 2
    }
  ]
};

  7.類型編程-條件判斷

/* 類型編程-條件判斷 */

export declare type Person<T extends "User" | "Admin"> = T extends "User"
  ? {
      username: string;
    }
  : {
      username: string;
      role: string;
    };

const user: Person<"User"> = { username: "xiaoming" }; // OK

const admin: Person<"Admin"> = { username: "xiaofang", role: "manager" }; // OK

  8.React 組件 Props 范型

/* React 組件 Props 范型 */

import { useState } from "react";

// value 可為字符串或數字
type Value = number | string;
interface Props<T extends Value> {
  value?: T;
  onChange?: (v: T) => void;
  type?: "number" | "text";
}

const Input = <T extends Value>({
  value,
  onChange,
  type = "text"
}: Props<T>) => {
  return (
    <input
      value={value}
      onChange={(e) => {
        const { value } = e.target;
        onChange?.((type === "number" ? parseInt(value, 10) : value) as T);
      }}
      type={type}
    />
  );
};

// test
const Test = () => {
  const [num, setNum] = useState(0);
  const [str, setStr] = useState("");

  return (
    <div>
      <Input value={num} onChange={(v) => setNum(v)} type="number" />
      <Input value={str} onChange={(v) => setStr(v)} />
    </div>
  );
};

export default Input;

  更多關于前端培訓的問題,歡迎咨詢千鋒教育在線名師,如果想要了解我們的師資、課程、項目實操的話可以點擊咨詢課程顧問,獲取試聽資格來試聽我們的課程,在線零距離接觸千鋒教育大咖名師,讓你輕松從入門到精通。

tags:
聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。
10年以上業內強師集結,手把手帶你蛻變精英
請您保持通訊暢通,專屬學習老師24小時內將與您1V1溝通
免費領取
今日已有369人領取成功
劉同學 138****2860 剛剛成功領取
王同學 131****2015 剛剛成功領取
張同學 133****4652 剛剛成功領取
李同學 135****8607 剛剛成功領取
楊同學 132****5667 剛剛成功領取
岳同學 134****6652 剛剛成功領取
梁同學 157****2950 剛剛成功領取
劉同學 189****1015 剛剛成功領取
張同學 155****4678 剛剛成功領取
鄒同學 139****2907 剛剛成功領取
董同學 138****2867 剛剛成功領取
周同學 136****3602 剛剛成功領取
相關推薦HOT
色综合老司机第九色激情 _中文字幕日韩av资源站_国产+人+亚洲_久久久精品影院_久久久视频免费观看_欧美激情亚洲自拍_亚洲成av人片在线观看香蕉_热草久综合在线_欧美极品第一页_2020国产精品自拍
国产欧美日韩卡一| 国产精品一区二区免费不卡 | 色呦呦日韩精品| 久久精品一区二区三区av| 精品中文字幕一区二区小辣椒| 91精品国产免费久久综合| 日本欧美一区二区三区| 日韩欧美视频一区| 国产不卡视频在线播放| 亚洲色图在线播放| 欧美日韩国产乱码电影| 韩国av一区二区三区四区| 久久久不卡网国产精品二区| gogo大胆日本视频一区| 一区二区三区高清不卡| 欧美日韩国产精品成人| 国产精品亚洲成人| 亚洲精品久久久蜜桃| 欧美一区二区三区四区在线观看| 久久99精品国产麻豆婷婷洗澡| 国产精品欧美经典| 欧美精品第一页| 大白屁股一区二区视频| 日韩电影免费在线看| 国产日产精品1区| 91麻豆精品一区二区三区| 男女男精品视频| 一区二区三区在线观看动漫| 久久蜜桃av一区二区天堂| 欧洲亚洲国产日韩| 成人黄色片在线观看| 日韩国产在线一| 亚洲欧洲在线观看av| 日韩午夜中文字幕| 91色乱码一区二区三区| 久久91精品久久久久久秒播| 午夜一区二区三区视频| 国产精品理论在线观看| 精品日韩一区二区| 欧美一级在线免费| 欧美人妖巨大在线| 在线观看网站黄不卡| 成人黄色电影在线| 精品在线一区二区| 蜜臀久久久久久久| 免费看黄色91| 青青草精品视频| 天天影视色香欲综合网老头| 亚洲综合成人在线| 亚洲一区二区三区影院| 亚洲视频 欧洲视频| 亚洲日本在线天堂| 亚洲欧美在线高清| 一二三区精品福利视频| 一区二区三区四区不卡在线| 亚洲免费看黄网站| 亚洲国产精品一区二区www在线 | 亚洲日本在线看| 亚洲欧美日韩国产综合| 亚洲视频一区在线观看| 日韩手机在线导航| 国产精品久久久99| 欧美一区二区三区在线视频| 色综合欧美在线| 久久综合九色综合97_久久久| 成人av手机在线观看| 国产成人一区二区精品非洲| 亚洲一区二区精品3399| 欧美视频在线一区二区三区| 欧美精品国产精品| 欧美日韩成人激情| 欧美视频中文一区二区三区在线观看| 91理论电影在线观看| 亚洲欧美日韩系列| 欧美日韩国产色站一区二区三区| 国产欧美精品一区二区色综合 | 成人免费观看视频| 国产成人精品1024| 北条麻妃一区二区三区| 91精品福利视频| 欧美一区二区三区公司| 中文字幕一区二区三区蜜月 | 亚洲小说春色综合另类电影| 免费成人性网站| 色偷偷成人一区二区三区91 | 欧美日韩高清不卡| 久久久91精品国产一区二区精品| 亚洲男人都懂的| 韩国精品一区二区| 欧美日韩三级视频| 国产视频一区在线播放| 亚洲国产精品自拍| a亚洲天堂av| 精品1区2区在线观看| 亚洲精品美国一| 国产99精品视频| 欧美刺激脚交jootjob| 一区二区免费视频| 成人福利视频在线| 久久日韩粉嫩一区二区三区| 亚洲午夜激情网页| 一本色道久久综合精品竹菊| 国产亚洲成aⅴ人片在线观看 | 久久综合九色综合97婷婷女人 | 亚洲另类春色校园小说| 国产精品一区2区| 欧美一区二区美女| 蜜桃视频在线一区| 精品国产免费久久| 精品一区二区免费在线观看| 欧美精品v国产精品v日韩精品 | 日韩高清不卡一区| 97se狠狠狠综合亚洲狠狠| 天堂久久久久va久久久久| 美女mm1313爽爽久久久蜜臀| 成人免费毛片app| 中文字幕一区二区三区在线不卡 | 中文字幕在线不卡一区二区三区| av午夜一区麻豆| 午夜一区二区三区视频| 亚洲h在线观看| 日本伊人精品一区二区三区观看方式| 亚洲精品伦理在线| 国产成人在线观看免费网站| 久久久99精品免费观看| 日韩美女在线视频 | 国产精品中文欧美| 麻豆91在线播放免费| 蜜桃视频在线一区| 欧美三级日本三级少妇99| 成人高清伦理免费影院在线观看| 奇米精品一区二区三区在线观看 | 久久国产精品99精品国产| 蜜桃久久精品一区二区| 国产伦精品一区二区三区视频青涩| 国产精品视频免费| 欧洲激情一区二区| 成人午夜精品在线| 日韩欧美国产成人一区二区| 美女网站视频久久| 久久午夜色播影院免费高清| 91美女片黄在线观看| 欧美人与z0zoxxxx视频| 国产亚洲人成网站| 午夜久久久久久电影| 丰满少妇在线播放bd日韩电影| 黄网站免费久久| caoporen国产精品视频| 亚洲精品日日夜夜| 91国产视频在线观看| 国产欧美日韩精品a在线观看| 99久久免费精品| 三级在线观看一区二区| 国产精品区一区二区三| 欧美日韩aaa| 99精品偷自拍| 国产福利一区二区三区在线视频| 成人免费小视频| 精品播放一区二区| 欧美日韩精品欧美日韩精品| 成人av资源在线| 激情成人综合网| 日韩精品电影在线观看| 亚洲精品老司机| 亚洲欧美日韩综合aⅴ视频| 国产欧美视频在线观看| 欧美xfplay| 欧美mv日韩mv| 欧美成人午夜电影| 欧美日韩中文另类| 懂色av噜噜一区二区三区av| 青草av.久久免费一区| 午夜精品爽啪视频| 午夜久久电影网| 午夜精品成人在线视频| 亚洲综合一区二区精品导航| 亚洲激情综合网| 亚洲一区二区三区四区中文字幕| 亚洲欧洲国产日本综合| 国产麻豆视频一区| 韩国一区二区视频| 日本vs亚洲vs韩国一区三区二区| 中文字幕在线不卡| 欧美一区二区视频在线观看2020 | 中文字幕不卡的av| 26uuu亚洲| 国产精品视频你懂的| 国产精品免费视频一区| **性色生活片久久毛片| 亚洲精品成人天堂一二三| 亚洲va天堂va国产va久| 麻豆精品视频在线| 成人深夜福利app| 色美美综合视频| 欧美一区二区三区爱爱| 久久久亚洲精品石原莉奈| 中文字幕亚洲一区二区av在线| 亚洲自拍偷拍图区| 国产乱码一区二区三区| 在线一区二区视频|