怎么做網(wǎng)站 有空間注冊(cè)網(wǎng)站需要多少錢(qián)?
文章目錄
- 1. 什么是 TypeScript?它與 JavaScript 有什么區(qū)別?
- 2. TS 泛型、接口、泛型工具record、Pick、Omit
- 3. TS unknow和any的區(qū)別,如何告訴編譯器unknow一定是某個(gè)類(lèi)型?
- 4. 元組與常規(guī)數(shù)組的區(qū)別
- 5. 什么是泛型,有什么作用?
- 6. 什么是裝飾器?
1. 什么是 TypeScript?它與 JavaScript 有什么區(qū)別?
TypeScript 是一種由 Microsoft 開(kāi)發(fā)的開(kāi)源編程語(yǔ)言,它是 JavaScript 的一個(gè)超集,可以編譯成純 JavaScript。與 JavaScript 相比,TypeScript 引入了靜態(tài)類(lèi)型、類(lèi)、接口等概念,以提供更好的代碼可維護(hù)性、類(lèi)型檢查和開(kāi)發(fā)體驗(yàn)。
TypeScript 的優(yōu)勢(shì)是什么?
- 靜態(tài)類(lèi)型檢查: TypeScript 允許聲明變量、函數(shù)等的類(lèi)型,從而在開(kāi)發(fā)過(guò)程中捕獲潛在的類(lèi)型錯(cuò)誤。
- 代碼可讀性: 明確的類(lèi)型聲明使代碼更易讀懂和維護(hù)。
- 智能感知: TypeScript 提供了更好的 IDE 智能感知,增強(qiáng)了代碼自動(dòng)完成和提示功能。
- 重構(gòu)支持: 類(lèi)型信息可以幫助 IDE 在重構(gòu)代碼時(shí)更準(zhǔn)確地識(shí)別變量和函數(shù)引用。
- 代碼提示: 使用 TypeScript,您可以在開(kāi)發(fā)過(guò)程中獲得更多的代碼提示和文檔。
TypeScript 中的基本類(lèi)型有哪些?
- number: 數(shù)字類(lèi)型
- string: 字符串類(lèi)型
- boolean: 布爾類(lèi)型
- null 和 undefined: 用于表示為空值
- void: 表示沒(méi)有返回值的函數(shù)
- any: 表示任意類(lèi)型
- object: 表示非原始類(lèi)型的類(lèi)型
- array: 數(shù)組類(lèi)型
- tuple: 元組類(lèi)型
- enum: 枚舉類(lèi)型
2. TS 泛型、接口、泛型工具record、Pick、Omit
泛型:目的是在成員之間提供有意義的約束,這些成員可以是:類(lèi)的實(shí)例成員、類(lèi)的方法、函數(shù)參數(shù)和函數(shù)返回值。
Record:它用來(lái)生成一個(gè)屬性為 K,類(lèi)型為 T 的類(lèi)型集合。
type Foo = Record<'a', string>
生成的對(duì)象key都為’a’,value只能為string類(lèi)型
Pick:從 T 中將所有的 K 取出來(lái),并生成一個(gè)新的類(lèi)型。
const foo: Pick<IFoo, 'a'>
使用 Pick 生成的新類(lèi)型只包含 a 屬性
Omit:用來(lái)忽略 T 中的 K 屬性
type UserWithoutEmail = Omit<User, 'email'>
忽略User中的email屬性
3. TS unknow和any的區(qū)別,如何告訴編譯器unknow一定是某個(gè)類(lèi)型?
- any:任意類(lèi)型,放棄了ts類(lèi)型檢查,允許對(duì)其進(jìn)行任意操作
- unknow:暫時(shí)未知類(lèi)型,之后仍然會(huì)進(jìn)行ts檢查,使用時(shí)需要進(jìn)行類(lèi)型檢查或類(lèi)型斷言后才能進(jìn)行操作,更加安全
將任何類(lèi)型賦值給any類(lèi)型的變量,并執(zhí)行任何操作,和js相同。
將任何值賦值給unknow類(lèi)型,但是需要進(jìn)行類(lèi)型檢查或者斷言才可以進(jìn)行操作。
1.類(lèi)型斷言
let value: unknow = 'hello';
let length: number = (value as string).length;
2.類(lèi)型判斷
function func(value: unknow): void {if (typeof value === 'string') {console.log(value.toUpperCase())} else if (Array.isArray(value)) {console.log(value.length)}
}
4. 元組與常規(guī)數(shù)組的區(qū)別
- TypeScript 中的元組是一個(gè)數(shù)組,其中元素的類(lèi)型、順序和數(shù)量已知。例如,[string, number] 元組類(lèi)型期望第一個(gè)元素是字符串,第二個(gè)元素是數(shù)字。
- 常規(guī)數(shù)組只知道元素的類(lèi)型,而不知道順序或計(jì)數(shù)。
5. 什么是泛型,有什么作用?
泛型(Generics)是指在定義函數(shù)、接口或類(lèi)的時(shí)候,不預(yù)先指定具體的類(lèi)型,而在使用的時(shí)候再指定類(lèi)型的一種特性。
function createArray<T>(length: number, value: T): Array<T> {let result: T[] = [];for (let i = 0; i < length; i++) {result[i] = value;}return result;
}
createArray<string>(3, 'x'); // ['x', 'x', 'x']
泛型約束:在函數(shù)內(nèi)部使用泛型變量的時(shí)候,由于事先不知道它是哪種類(lèi)型,所以不能隨意的操作它的屬性或方法,此時(shí)可以對(duì)泛型進(jìn)行約束
// 對(duì)泛型T進(jìn)行了約束,一定含有一個(gè)length屬性
interface Lengthwise {length: number;
}
function loggingIdentity<T extends Lengthwise>(arg: T): T {console.log(arg.length);return arg;
}
loggingIdentity(7);
泛型作用:泛型可以用在函數(shù)、接口、類(lèi)
泛型優(yōu)點(diǎn):
- 使用泛型的主要好處在于提高代碼的復(fù)用性和靈活性。通過(guò)泛型,我們可以編寫(xiě)不特定數(shù)據(jù)類(lèi)型的代碼,使得這些代碼可以適用于不同的數(shù)據(jù)類(lèi)型。這樣一來(lái),我們不需要為每種數(shù)據(jù)類(lèi)型編寫(xiě)重復(fù)的代碼,從而減少了代碼冗余。
- 泛型還可以增加代碼的可讀性和可維護(hù)性。當(dāng)我們?cè)诰帉?xiě)泛型代碼時(shí),我們可以將代碼邏輯和數(shù)據(jù)類(lèi)型分離開(kāi)來(lái),使得代碼更加清晰和易于理解。同時(shí),泛型還可以在編譯時(shí)進(jìn)行類(lèi)型檢查,提前捕獲潛在的類(lèi)型錯(cuò)誤,減少了運(yùn)行時(shí)錯(cuò)誤的可能性。
- 另外,泛型還使得我們可以更好地封裝代碼,隱藏內(nèi)部實(shí)現(xiàn)細(xì)節(jié)。這樣可以提高代碼的安全性,并使得代碼更易于維護(hù)和升級(jí)。
6. 什么是裝飾器?
裝飾器是一種特殊類(lèi)型的聲明,它能夠被附加到類(lèi)聲明,方法, 訪問(wèn)符,屬性或參數(shù)上
是一種在不改變?cè)?lèi)和使用繼承的情況下,動(dòng)態(tài)地?cái)U(kuò)展對(duì)象功能
同樣的,本質(zhì)也不是什么高大上的結(jié)構(gòu),就是一個(gè)普通的函數(shù),@expression 的形式其實(shí)是Object.defineProperty的語(yǔ)法糖
expression求值后必須也是一個(gè)函數(shù),它會(huì)在運(yùn)行時(shí)被調(diào)用,被裝飾的聲明信息做為參數(shù)傳入
裝飾器作用:類(lèi)、方法/屬性、參數(shù)、訪問(wèn)器
function addAge(constructor: Function) {constructor.prototype.age = 18;
}
@addAge
class Person{name: string;age!: number;constructor() {this.name = 'huihui';}
}
let person = new Person();
console.log(person.age); // 18
裝飾器優(yōu)點(diǎn):
- 代碼可讀性變強(qiáng)了,裝飾器命名相當(dāng)于一個(gè)注釋
- 在不改變?cè)写a情況下,對(duì)原來(lái)功能進(jìn)行擴(kuò)展
后面的使用場(chǎng)景中,借助裝飾器的特性,除了提高可讀性之后,針對(duì)已經(jīng)存在的類(lèi),可以通過(guò)裝飾器的特性,在不改變?cè)写a情況下,對(duì)原來(lái)功能進(jìn)行擴(kuò)展。