1.TS有哪些類型(對比與js)?
關鍵字/語法 | 用途 | 示例 |
| 關閉類型檢查 |
|
| 類型安全的 any |
|
| 永不存在的值 |
|
| 無返回值 |
|
| 枚舉 |
|
| “或”關系 |
|
| “且”關系 |
|
| 精確值 |
|
| 只讀屬性 |
|
|
| |
| 取鍵聯合 |
|
| 取變量類型 |
|
|
| |
| 保證表達式符合某類型并推斷更精確類型 | |
條件類型 |
| |
| 在條件類型里提取子類型 | |
映射類型 |
| |
模板字符串類型 |
|
2.type和interface的區別?何時用哪個?
在 90 % 的日常代碼里兩者可以互換;但 interface
可以同名自動合并、被類實現/繼承,而 type
可以做聯合、交叉、元組等更復雜的復合類型。官方推薦:描述對象形狀優先用 interface
,需要組合、映射、條件類型時用 type
維度 | interface | type |
官方定位 | 描述“對象形狀”(shape / contract) | 描述任意“類型表達式” |
能否同名合并(Declaration Merging) | ? 自動合并 | ? 重復定義即報錯 |
繼承 / 實現 | ? | ? 不能被類實現 |
聯合類型(|) | ? 不支持 | ? |
交叉類型(&) | ? 不支持 | ? |
元組 / 映射 / 條件 / infer | ? 不支持 | ? 支持全部高級類型體操 |
基本對象描述 | ? | ? |
遞歸類型 | ? 支持 | ? 支持 |
運行時表現 | 完全擦除,無差異 | 完全擦除,無差異 |
對象、繼承、合并用 interface;其余復雜場景用 type
3.什么是類型斷言?如何使用?
類型斷言(Type Assertion) 就是「開發者比編譯器更懂類型,手動告訴它」的語法糖;它只在 編譯階段 起作用,運行時無任何效果
語法 | 示例 | 備注 |
尖括號(不推薦 JSX 環境) |
| 易與 JSX 混淆 |
as 寫法(推薦) |
| 通用、可讀性高 |
4.什么是泛型?
泛型是一種在定義函數、接口或類時不預先指定具體類型,而在使用時再指定類型的特性
用 T(或其他大寫字母)作為“泛型”占位符,讓同一段代碼能夠復用于不特定的數據類型
// 一顆星 T:傳入什么類型,就返回什么類型
function echo<T>(value: T): T {return value;
}echo<string>('hello'); // T 點亮成 string
echo<number>(42); // T 點亮成 number
5.裝飾器是什么,如何使用?
裝飾器是一種特殊類型的聲明,可以附加到類、方法、訪問符、屬性或參數上。本質是函數
// 類裝飾器
function sealed(constructor: Function) {Object.seal(constructor);Object.seal(constructor.prototype);
}@sealed
class Greeter {greeting: string;constructor(message: string) {this.greeting = message;}greet() {return "Hello, " + this.greeting;}
}// 方法裝飾器
function log(target: any, propertyKey: string, descriptor: PropertyDescriptor) {let originalMethod = descriptor.value;descriptor.value = function(...args: any[]) {console.log(`Calling ${propertyKey} with`, args);return originalMethod.apply(this, args);};return descriptor;
}class Calculator {@logadd(x: number, y: number) {return x + y;}
}
6.講解一下ts的枚舉?
TypeScript 枚舉在編譯期生成一個鍵值雙向映射對象(數字 enum)或單向對象(字符串 enum),既能當類型又能當值;使用 const enum
可徹底消除運行時開銷
TypeScript 中的枚舉(Enums)是一種特殊的對象類型,它允許我們定義一組命名常量。這使得代碼更具可讀性和可維護性,尤其是在處理一組固定的值時非常有用。
enum Direction {Up,Down,Left,Right,
}
console.log(Direction.Up); // 輸出 0
enum Direction {Up = "UP",Down = "DOWN",Left = "LEFT",Right = "RIGHT",
}
console.log(Direction.Up); // 輸出 "UP"