91aaa在线国内观看,亚洲AV午夜福利精品一区二区,久久偷拍人视频,久久播这里有免费视播

<strong id="fvuar"></strong>

  • <sub id="fvuar"><dl id="fvuar"><em id="fvuar"></em></dl></sub>

    1. 千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

      手機(jī)站
      千鋒教育

      千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

      千鋒教育

      掃一掃進(jìn)入千鋒手機(jī)站

      領(lǐng)取全套視頻
      千鋒教育

      關(guān)注千鋒學(xué)習(xí)站小程序
      隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

      當(dāng)前位置:首頁(yè)  >  技術(shù)干貨  > 15個(gè)Typescript項(xiàng)目常用語(yǔ)法練習(xí),學(xué)會(huì)它,90%的場(chǎng)景不害怕?。ǘ?

      15個(gè)Typescript項(xiàng)目常用語(yǔ)法練習(xí),學(xué)會(huì)它,90%的場(chǎng)景不害怕?。ǘ?/h1>
      來(lái)源:千鋒教育
      發(fā)布人:syq
      時(shí)間: 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項(xiàng)目常用語(yǔ)法

        2.部分對(duì)象 Partial

      /* 部分對(duì)象 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.類型編程-從基礎(chǔ)類型構(gòu)造新類型

      /* 類型編程-從基礎(chǔ)類型構(gòu)造新類型 */

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

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

      // 2. ObjectOfStringValue
      // ObjectOfStringValue 對(duì)象的值只能為數(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 對(duì)象的值只能為User類型
      type ObjectOfUserValue = CustomObject<string, User>;

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

        5.對(duì)象類型的繼承

      /* 對(duì)象類型的繼承 */

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

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

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

        6.對(duì)象類型的修改

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

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

      // 1. 去除 TreeNode id 屬性同時(shí)修改 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;

        更多關(guān)于前端培訓(xùn)的問(wèn)題,歡迎咨詢千鋒教育在線名師,如果想要了解我們的師資、課程、項(xiàng)目實(shí)操的話可以點(diǎn)擊咨詢課程顧問(wèn),獲取試聽(tīng)資格來(lái)試聽(tīng)我們的課程,在線零距離接觸千鋒教育大咖名師,讓你輕松從入門到精通。

      tags:
      聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
      10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
      請(qǐng)您保持通訊暢通,專屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
      免費(fèi)領(lǐng)取
      今日已有369人領(lǐng)取成功
      劉同學(xué) 138****2860 剛剛成功領(lǐng)取
      王同學(xué) 131****2015 剛剛成功領(lǐng)取
      張同學(xué) 133****4652 剛剛成功領(lǐng)取
      李同學(xué) 135****8607 剛剛成功領(lǐng)取
      楊同學(xué) 132****5667 剛剛成功領(lǐng)取
      岳同學(xué) 134****6652 剛剛成功領(lǐng)取
      梁同學(xué) 157****2950 剛剛成功領(lǐng)取
      劉同學(xué) 189****1015 剛剛成功領(lǐng)取
      張同學(xué) 155****4678 剛剛成功領(lǐng)取
      鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
      董同學(xué) 138****2867 剛剛成功領(lǐng)取
      周同學(xué) 136****3602 剛剛成功領(lǐng)取
      相關(guān)推薦HOT
      什么是PlatformIo?

      PlatformIO是什么PlatformIO是一個(gè)全面的物聯(lián)網(wǎng)開(kāi)發(fā)平臺(tái),它為眾多硬件平臺(tái)和開(kāi)發(fā)環(huán)境提供了統(tǒng)一的工作流程,有效簡(jiǎn)化了開(kāi)發(fā)過(guò)程,并能兼容各種...詳情>>

      2023-10-14 12:55:06
      云快照與自動(dòng)備份有什么區(qū)別?

      1、定義和目標(biāo)不同云快照的主要目標(biāo)是提供一種快速恢復(fù)數(shù)據(jù)的方法,它只記錄在快照時(shí)間點(diǎn)后的數(shù)據(jù)變化,而不是所有的數(shù)據(jù)。自動(dòng)備份的主要目標(biāo)...詳情>>

      2023-10-14 12:48:59
      服務(wù)器為什么要用Linux?

      服務(wù)器為什么要用Linux作為服務(wù)器操作系統(tǒng)的優(yōu)選,Linux在眾多選擇中脫穎而出。Linux作為服務(wù)器操作系統(tǒng)的優(yōu)選,有其獨(dú)特的優(yōu)勢(shì)和特點(diǎn)。包括其...詳情>>

      2023-10-14 12:34:11
      ORM解決的主要問(wèn)題是什么?

      ORM(對(duì)象關(guān)系映射)解決的主要問(wèn)題是將關(guān)系數(shù)據(jù)庫(kù)與面向?qū)ο缶幊讨g的映射困境。在傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)中,數(shù)據(jù)以表格的形式存儲(chǔ),而在面向?qū)ο?..詳情>>

      2023-10-14 12:26:19
      Go為什么不支持三元運(yùn)算符?

      Go為什么不支持三元運(yùn)算符Go語(yǔ)言是一種以簡(jiǎn)潔和有效性為目標(biāo)的編程語(yǔ)言,因此在設(shè)計(jì)過(guò)程中,Go的設(shè)計(jì)者刻意排除了一些他們認(rèn)為可能導(dǎo)致復(fù)雜性或...詳情>>

      2023-10-14 12:12:36