日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > vue >内容正文

vue

th:text为null报错_为vue3.0的学习TS解读高级类型

發布時間:2025/3/11 vue 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 th:text为null报错_为vue3.0的学习TS解读高级类型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

知識點摘要

本節課主要關鍵詞為:?自動類型推斷?/?類型斷言?/?類型別名(type)?/?映射類型(Pick/Record等...)?/?條件類型(extends)?/?類型推斷(infer)

自動類型推斷(不用你標類型了,ts自己猜)

?大家現在寫ts的時候一定會在每個變量后面都加上類型吧? 但是?

現在告訴大家有些情況下你不需要標注類型, ts可以根據你寫的代碼來自動推斷出類型:

賦值字面量給變量

let n = 1; // ts會自動推斷出n是number類型
n+=3 // 不報錯,因為已知類型

let arr1 = []; // 類型為: any[]
arr1.push(1,2,{o:3});

let arr = [1]; // 內部要有數字, 才能推斷出正確類型
arr.push(2);

自動閱讀if條件判斷
let n: number|null = 0.5 < Math.random() ? 1:null;
if(null !== n){
n+=3 // ts知道現在n不是null是number
}
瀏覽器自帶api
document.ontouchstart = ev=>{ // 能自動推斷出ev為TouchEvent
console.log(ev.touches); // 不報錯, TouchEvent上有touches屬性
}
typeof

typeof就是js中的typeof, ts會根據你代碼中出現的typeof來自動推斷類型:

let n:number|string = 0.5 < Math.random()? 1:'1';

// 如果沒有typeof, n*=2會報錯, 提示沒法推斷出當前是number類型, 不能進行乘法運算
if('number' === typeof n) {
n*= 2;
} else {
n= '2';
}

注意: 在ts文檔中, 該部分的知識點叫做typeof類型保護, 和其他類型推斷的內容是分開的, 被寫在高級類型/類型保護章節中.

instanceof

ts會根據你代碼中出現的instanceof來自動推斷類型:

let obj = 0.5 < Math.random() ? new String(1) : new Array(1);
if(obj instanceof String){
// obj推斷為String類型
obj+= '123'
} else {
// obj為any[]類型
obj.push(123);
}

注意: 在ts文檔中, 該部分的知識點叫做instanceof類型保護, 和其他類型推斷的內容是分開的, 被寫在高級類型/類型保護章節中.

類型斷言(你告訴ts是什么類型, 他都信)

有些情況下系統沒辦法自動推斷出正確的類型, 就需要我們標記下, 斷言有2種語法, 一種是通過"<>", 一種通過"as", 舉例說明:

let obj = 0.5 < Math.random() ? 1 : [1]; // number|number[]

// 斷言, 告訴ts, obj為數組
(<number[]>obj).push(1);

//等價
(obj as number[]).push(1);

類型別名(type)

類型別名可以表示很多接口表示不了的類型, 比如字面量類型(常用來校驗取值范圍):

type A = 'top'|'right'|'bottom'|'left'; // 表示值可能是其中的任意一個
type B = 1|2|3;
type C = '紅'|'綠'|'黃';
type D = 150;

let a:A = 'none'; // 錯誤, A類型中沒有'none'
更多組合:
interface A1{
a:number;
}
type B = A1 | {b:string};
type C = A1 & {b:string};

// 與泛型組合
type D<T> = A1 | T[];

索引類型(keyof)

js中的Object.keys大家肯定都用過,?獲取對象的鍵值, ts中的keyof和他類似, 可以用來獲取對象類型的鍵值:

type A = keyof {a:1,b:'123'} // 'a'|'b'
type B = keyof [1,2] // '1'|'2'|'push'... , 獲取到內容的同時, 還得到了Array原型上的方法和屬性(實戰中暫時沒遇到這種需求, 了解即可)

可以獲得鍵值, 也可以獲取對象類型的值的類型:

type C = A['a'] // 等于type C = 1;
let c:C = 2 // 錯誤, 值只能是1

映射類型(Readonly, Pick, Record等...)

映射類型比較像修改類型的工具函數, 比如Readonly可以把每個屬性都變成只讀:

type A = {a:number, b:string}
type A1 = Readonly<A> // {readonly a: number;readonly b: string;}

打開node_modules/typescript/lib文件夾可以找到lib.es5.d.ts, 在這我們能找到Readonly的定義:

type Readonly<T> = {
readonly [P in keyof T]: T[P];
};

其實不是很復雜, 看了本節課前面前面的內容, 這個很好理解是吧:

  • 定義一個支持泛型的類型別名, 傳入類型參數T.

  • 通過keyof獲取T上的鍵值集合.

  • 用in表示循環keyof獲取的鍵值.

  • 添加readonly標記.

  • Partial, 讓屬性都變成可選的
    type A = {a:number, b:string}
    type A1 = Partial<A> // { a?: number; b?: string;}
    Required, 讓屬性都變成必選
    type A = {a?:number, b?:string}
    type A1 = Required<A> // { a: number; b: string;}
    Pick, 只保留自己選擇的屬性, U代表屬性集合
    type A = {a:number, b:string}
    type A1 = Pick<A, 'a'> // {a:number}
    Omit 實現排除已選的屬性
    type A = {a:number, b:string}
    type A1 = Omit<A, 'a'> // {b:string}
    Record, 創建一個類型,T代表鍵值的類型, U代表值的類型
    type A1 = Record<string, string> // 等價{[k:string]:string}
    Exclude, 過濾T中和U相同(或兼容)的類型
    type A = {a:number, b:string}
    type A1 = Exclude<number|string, string|number[]> // number

    // 兼容
    type A2 = Exclude<number|string, any|number[]> // never , 因為any兼容number, 所以number被過濾掉
    Extract, 提取T中和U相同(或兼容)的類型
    type A = {a:number, b:string}
    type A1 = Extract<number|string, string|number[]> // string
    NonNullable, 剔除T中的undefined和null
    type A1 = NonNullable<number|string|null|undefined> // number|string
    ReturnType, 獲取T的返回值的類型
    type A1= ReturnType<()=>number> // number
    InstanceType, 返回T的實例類型

    ts中類有2種類型, 靜態部分的類型和實例的類型, 所以T如果是構造函數類型, 那么InstanceType可以返回他的實例類型:

    interface A{
    a:HTMLElement;
    }

    interface AConstructor{
    new():A;
    }

    function create (AClass:AConstructor):InstanceType<AConstructor>{
    return new AClass();
    }
    Parameters 獲取函數參數類型

    返回類型為元祖, 元素順序同參數順序.

    interface A{
    (a:number, b:string):string[];
    }

    type A1 = Parameters<A> // [number, string]
    ConstructorParameters 獲取構造函數的參數類型

    和Parameters類似, 只是T這里是構造函數類型.

    interface AConstructor{
    new(a:number):string[];
    }

    type A1 = ConstructorParameters<AConstructor> // [number]

    extends(條件類型)

    T extends U ? X : Y

    用來表示類型是不確定的, 如果U的類型可以表示T, 那么返回X, 否則Y. 舉幾個例子:

    type A = string extends '123' ? string :'123' // '123'
    type B = '123' extends string ? string :123 // string

    明顯string的范圍更大,?'123'可以被string表示, 反之不可.

    infer(類型推斷)

    單詞本身的意思是"推斷", 實際表示在extends條件語句中聲明待推斷的類型變量. 我們上面介紹的映射類型中就有很多都是ts在lib.d.ts中實現的, 比如Parameters:

    type Parameters<T extends (...args: any) => any> = T extends (...args: infer P) => any ? P : never;

    上面聲明一個P用來表示...args可能的類型, 如果(...args: infer P)可以表示?T, 那么返回...args對應的類型, 也就是函數的參數類型, 反之返回never.

    注意:?開始的T extends (...args: any) => any用來校驗輸入的T是否是函數, 如果不是ts會報錯, 如果直接替換成T不會有報錯, 會一直返回never.

    應用infer

    接下來我們利用infer來實現"刪除元祖類型中第一個元素", 這常用于簡化函數參數

    export type Tail<Tuple extends any[]> = ((...args: Tuple) => void) extends ((a: any, ...args: infer T) => void) ? T : never

    ---END---

    選擇”Vue社區?“星標?,內容一觸即達。點擊原文更多驚喜!

    開發者技術前線?匯集技術前線快訊和關注行業趨勢,大廠干貨,是開發者經歷和成長的優秀指南。

    歷史推薦

    7個有用的Vue開發技巧

    JavaScript八張思維導圖

    JavaScript 之實現一個簡單的 Vue

    聽說有人不敢點這里 ?

    總結

    以上是生活随笔為你收集整理的th:text为null报错_为vue3.0的学习TS解读高级类型的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 东京久久 | 精品久久久久久久免费人妻 | 一区二区三区国产精品 | 伊人网在线视频观看 | 红桃视频一区二区三区免费 | 在线观看麻豆视频 | 少妇视频一区二区三区 | 无码人妻精品中文字幕 | 国产一区二区小说 | 成人网av | 亚洲精品久久久蜜桃网尤妮丝 | 在线观看免费高清视频 | 久久亚洲精选 | 亚洲综合a| 18视频在线观看网站 | 国产精品国语自产拍在线观看 | 免费又黄又爽又色的视频 | www激情com| 欧美一区二 | 在线观看网站黄 | 国产香蕉97碰碰碰视频在线观看 | 久久亚洲精品无码va白人极品 | 国产chinese男男gaygay视频 | 久久久久久中文字幕 | 观看毛片 | 18在线观看视频 | 欧美三区四区 | 亲嘴脱内衣内裤 | 碰碰久久| 亚洲成人基地 | 伊人激情 | 欧美日韩啪啪 | 亚洲iv一区二区三区 | 亚洲自拍偷拍精品 | 亚洲国产精品久久久久爰色欲 | 亚洲精品一区二区口爆 | 日韩福利网站 | 视频在线免费观看 | 青青草免费在线观看视频 | 亚洲一级在线观看 | 国产小视频网址 | 日韩av一区在线 | 亚洲精品乱码 | 深夜免费福利视频 | 在线观看亚洲天堂 | 午夜精品福利视频 | 美女极度色诱图片www视频 | 日本黄色中文字幕 | 国产欧美一区二区三区在线看蜜臀 | 在线看片国产 | a级黄色片网站 | 欧美综合在线视频 | 亚洲av熟女国产一区二区性色 | 天天摸日日干 | 九色自拍视频 | 久草免费在线视频观看 | 性综艺节目av在线播放 | 亚洲电影在线看 | 色吧综合网 | 青青国产精品视频 | 蜜芽一区二区 | 无码精品一区二区三区在线 | 久久激情网站 | 99精品在线视频观看 | 调教驯服丰满美艳麻麻在线视频 | 欧美一区二区网站 | 中文字幕二区在线观看 | 高潮网| 免费黄色一级视频 | 国产精品高潮呻吟 | 国产福利视频一区 | 91麻豆视频 | 星空大象在线观看免费播放 | 午夜在线观看av | 黄色资源在线观看 | 91精品久久久久久久久久 | 亚洲伦理在线观看 | 黄片毛片视频 | 黑人干亚洲女 | 91ts人妖另类精品系列 | 在线观看毛片视频 | 国内视频自拍 | 粉嫩av一区二区三区四区五区 | 久久精品国产清自在天天线 | 亚洲AV乱码国产精品观看麻豆 | 粉嫩久久99精品久久久久久夜 | 人妻射精一区二区 | 亚洲综合专区 | 亚洲精品乱码久久久久久蜜桃91 | 深夜视频在线 | 欧美有码视频 | xvideos成人免费视频 | 久久久久国色av免费观看性色 | 美景之屋电影免费高清完整韩剧 | 久久久久99精品成人片试看 | 亚洲成人精 | 国产福利精品在线 | 亚洲中文字幕无码一区 | 乌克兰毛片 |