本文總結一下TypeScript類型聲明的書寫,很多時候寫TypeScript不是問題,寫類型就特別糾結,我總結下,我在使用TypeScript中遇到的問題。如果你遇到類型聲明不會寫的時候,多看看lodash的聲明,因為lodash對數據進行各種變形操作,所以你能遇到的,都有參考示例。
基本類型
// 變量 const num: number = 1; const str: string = 'str'; const bool: boolean = true; const nulls: null = null; const undefine: undefined = undefined; const symbols: symbol = Symbol('symbal'); const any: any = 'any types'; // typescript的any類型,相當于什么類型約束都沒有數組
// 數組: 推薦使用T[]這種寫法 const nums: number[] = [1, 2, 3, 4]; // 不推薦:Array<T>泛型寫法,因為在JSX中不兼容,所以為了統一都使用T[]這種類型 const strs: Array<string> = ['s', 't', 'r']; const dates: Date[] = [new Date(), new Date()];
數組的concat方法,返回類型為never[]問題
// 數組concat方法的never問題 // 提示: Type 'string' is not assignable to type 'never'. const arrNever: string[] = [].concat(['s']); // 主要問題是:[]數組,ts無法根據上下文判斷數組內部元素的類型 // @see https://github.com/Microsoft/TypeScript/issues/10479 const fixArrNever: string[] = ([] as string[]).concat(['s']);
接口
接口是 TypeScript 的一個核心知識,它能合并眾多類型聲明至一個類型聲明:
而且接口可以用來聲明:函數,類,對象等數據類型
interface Name { first: string; second: string;}let username: Name = { first: 'John', second: 'Doe'};any、null、undefined、void類型
// 特殊類型const any: any = 'any types'; // typescript的any類型,相當于什么類型都沒寫let nobody: any = 'nobody, but you';nobody = 123;let nulls: number = null;let bool: boolean = undefined;// voidfunction printUsername (name: string): void { console.log(name);}聯合類型
聯合類型在option bags模式場景非常實用,使用 **| **來做標記
function options(opts: { types?: string; tag: string | number;}): void { }交叉類型
最典型的使用場景就是繼承和mixin,或者copy等操作
// 交叉類型:如果以后遇到此種類型聲明不會寫,直接看Object.assign聲明寫法function $extend<T, U>(first: T, second: U): T & U { return Object.assign(first, second); // 示意而已}元組 tuple
元組很少使用
let nameNumber: [string, number];// OknameNumber = ['Jenny', 221345];// Error// nameNumber = ['Jenny', '221345'];let tuple: [string, number];nameNumber = ['Jenny', 322134];const [usernameStr, uselessNum] = nameNumber;
新聞熱點
疑難解答
圖片精選