久久精品国产亚洲高清|精品日韩中文乱码在线|亚洲va中文字幕无码久|伊人久久综合狼伊人久久|亚洲不卡av不卡一区二区|精品久久久久久久蜜臀AV|国产精品19久久久久久不卡|国产男女猛烈视频在线观看麻豆

    1. <style id="76ofp"></style>

      <style id="76ofp"></style>
      <rt id="76ofp"></rt>
      <form id="76ofp"><optgroup id="76ofp"></optgroup></form>
      1. 千鋒教育-做有情懷、有良心、有品質的職業(yè)教育機構

        手機站
        千鋒教育

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

        千鋒教育

        掃一掃進入千鋒手機站

        領取全套視頻
        千鋒教育

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

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

        15個Typescript項目常用語法練習,學會它,90%的場景不害怕?。ǘ?/h1>
        來源:千鋒教育
        發(fā)布人: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.函數(shù)中 this 的使用

        /* 函數(shù)中 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 對象的值只能為數(shù)字類型
        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 可為字符串或數(shù)字
        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:
        聲明:本站稿件版權均屬千鋒教育所有,未經(jīng)許可不得擅自轉載。
        10年以上業(yè)內強師集結,手把手帶你蛻變精英
        請您保持通訊暢通,專屬學習老師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
        桑日县| 定陶县| 南木林县| 秭归县| 双流县| 徐闻县| 伊川县| 淅川县| 富蕴县| 连南| 涿州市| 武平县| 遵义县| 翼城县| 靖安县| 中宁县| 双鸭山市| 邹平县| 城口县| 全州县| 三明市| 庄浪县| 扶风县| 尼玛县| 龙里县| 兴义市| 玉山县| 怀化市| 汽车| 黄石市| 峨眉山市| 霞浦县| 雅江县| 廊坊市| 绥棱县| 温州市| 望城县| 紫金县| 大埔区| 绥滨县| 鄂州市|