[toc]
1、什么是TypeScript?
TypeScript是JavaScript的加強版,它給JavaScript添加了可選的靜態類型和基于類的面向對象編程,它拓展了JavaScript的語法。
而且TypeScript不存在跟瀏覽器不兼容的問題,因為在編譯時,它產生的都是JavaScript代碼。
2、TypeScript 和 JavaScript 的區別是什么?
Typescript 是 JavaScript 的超集,可以被編譯成 JavaScript 代碼。 用 JavaScript 編寫的合法代碼,在 TypeScript 中依然有效。Typescript 是純面向對象的編程語言,包含類和接口的概念。 程序員可以用它來編寫面向對象的服務端或客戶端程序,并將它們編譯成 JavaScript 代碼。
TypeScript和 JavaScript的關系
TypeScript 引入了很多面向對象程序設計的特征,包括:
interfaces 接口
classes 類
enumerated types 枚舉類型
generics 泛型
modules 模塊
主要不同點如下:
TS 是一種面向對象編程語言,而 JS 是一種腳本語言(盡管 JS 是基于對象的)。
TS 支持可選參數, JS 則不支持該特性。
TS 支持靜態類型,JS 不支持。
TS 支持接口,JS 不支持接口。
3為什么要用 TypeScript ?
TS 在開發時就能給出編譯錯誤, 而 JS 錯誤則需要在運行時才能暴露。
作為強類型語言,你可以明確知道數據的類型。代碼可讀性極強,幾乎每個人都能理解。
TS 非常流行,被很多業界大佬使用。像 Asana、Circle CI 和 Slack 這些公司都在用 TS。
4、TypeScript 和 JavaScript 哪個更好?
由于 TS 的先天優勢,TS 越來越受歡迎。但是TS 最終不可能取代 JS,因為 JS 是 TS 的核心。
選擇 TypeScript 還是 JavaScript 要由開發者自己去做決定。如果你喜歡類型安全的語言,那么推薦你選擇 TS。 如果你已經用 JS 好久了,你可以選擇走出舒適區學習 TS,也可以選擇堅持自己的強項,繼續使用 JS。
5、什么是泛型?
泛型是指在定義函數、接口或類的時候,不預先指定具體的類型,使用時再去指定類型的一種特性。
可以把泛型理解為代表類型的參數
// 我們希望傳入的值是什么類型,返回的值就是什么類型
// 傳入的值可以是任意的類型,這時候就可以用到 泛型
// 如果使用 any 的話,就失去了類型檢查的意義
function createArray1(length: any, value: any): Array<any> {
let result: any = [];
for (let i = 0; i < length; i++) {
result[i] = value;
}
return result;
}
let result = createArray1(3, 'x');
console.log(result);
// 最傻的寫法:每種類型都得定義一種函數
function createArray2(length: number, value: string): Array<string> {
let result: Array<string> = [];
for (let i = 0; i < length; i++) {
result[i] = value;
}
return result;
}
function createArray3(length: number, value: number): Array<number> {
let result: Array<number> = [];
for (let i = 0; i < length; i++) {
result[i] = value;
}
return result;
}
// 或者使用函數重載,寫法有點麻煩
function createArray4(length: number, value: number): Array<number>
function createArray4(length: number, value: string): Array<string>
function createArray4(length: number, value: any): Array<any> {
let result: Array<number> = [];
for (let i = 0; i < length; i++) {
result[i] = value;
}
return result;
}
createArray4(6, '666');
//使用泛型
// 有關聯的地方都改成 <T>
function createArray<T>(length: number, value: T): Array<T> {
let result: T[] = [];
for (let i = 0; i < length; i++) {
result[i] = value;
}
return result;
}
// 使用的時候再指定類型
let result = createArray<string>(3, 'x');
// 也可以不指定類型,TS 會自動類型推導
let result2 = createArray(3, 'x');
console.log(result);
6、TS中的類
TypeScript 是面向對象的 JavaScript。而其中的類描述了所創建的對象共同的屬性和方法。
傳統的JavaScript程序使用函數和基于原型的繼承來創建可重用的組件,但這對于熟悉使用面向對象方式的程序員來說有些棘手,因為他們用的是基于類的繼承并且對象是從類構建出來的。
從ECMAScript 2015,也就是ECMAScript 6,JavaScript程序將可以使用這種基于類的面向對象方法。在TypeScript里允許開發者現在就使用這些特性,并且編譯后的JavaScript可以在所有主流瀏覽器和平臺上運行,
7、什么是構造函數,構造函數作用是什么?
構造函數 ,是一種特殊的方法。主要用來在創建對象時初始化對象, 即為對象成員變量賦初始值,總與new運算符一起使用在創建對象的語句中。而TypeScript的構造函數用關鍵字constructor來實現。可以通過this(和java/C#一樣代表對象實例的成員訪問)關鍵字來訪問當前類體中的屬性和方法。
8、實例化是什么?
一般情況下,創建一個類后并不能直接的對屬性和方法進行引用,必須對類進行實例化,即創建一個對象。TypeScript中用new 關鍵字創建對象。實例化后通過“.”來訪問屬性和方法
9、方法重寫是什么?
子類可繼承父類中的方法,而不需要重新編寫相同的方法。但有時子類并不想原封不動地繼承父類的方法,而是想作一定的修改,這就需要采用方法的重寫
重寫的作用在于子類可以根據需要,定義特定于自己的行為。也就是說子類能夠根據需要實現父類的方法。
10、什么是可索引類型接口?
一般用來約束數組和對象
/ 數字索引——約束數組
// index 是隨便取的名字,可以任意取名
// 只要 index 的類型是 number,那么值的類型必須是 string
interface StringArray {
// key 的類型為 number ,一般都代表是數組
// 限制 value 的類型為 string
[index:number]:string
}
let arr:StringArray = ['aaa','bbb'];
console.log(arr);
// 字符串索引——約束對象
// 只要 index 的類型是 string,那么值的類型必須是 string
interface StringObject {
// key 的類型為 string ,一般都代表是對象
// 限制 value 的類型為 string
[index:string]:string
}
let obj:StringObject = {name:'ccc'};
11、什么是函數類型接口?
對方法傳入的參數和返回值進行約束
// 注意區別
// 普通的接口
interface discount1{
getNum : (price:number) => number
}
// 函數類型接口
interface discount2{
// 注意:
// “:” 前面的是函數的簽名,用來約束函數的參數
// ":" 后面的用來約束函數的返回值
(price:number):number
}
let cost:discount2 = function(price:number):number{
return price * .8;
}
// 也可以使用類型別名
type Add = (x: number, y: number) => number
let add: Add = (a: number, b: number) => a + b
12、什么是類類型接口?
如果接口用于一個類的話,那么接口會表示“行為的抽象”
對類的約束,讓類去實現接口,類可以實現多個接口
接口只能約束類的公有成員(實例屬性/方法),無法約束私有成員、構造函數、靜態屬性/方法
// 接口可以在面向對象編程中表示為行為的抽象
interface Speakable {
name: string;
// ":" 前面的是函數簽名,用來約束函數的參數
// ":" 后面的用來約束函數的返回值
speak(words: string): void
}
interface Speakable2 {
age: number;
}
class Dog implements Speakable, Speakable2 {
name!: string;
age = 18;
speak(words: string) {
console.log(words);
}
}
let dog = new Dog();
dog.speak('汪汪汪');
13、什么是混合類型接口?
一個對象可以同時做為函數和對象使用
interface FnType {
(getName:string):string;
}
interface MixedType extends FnType{
name:string;
age:number;
}
interface Counter {
(start: number): string;
interval: number;
reset(): void;
}
function getCounter(): Counter {
let counter = <Counter>function (start: number) { };
counter.interval = 123;
counter.reset = function () { };
return counter;
}
let c = getCounter();
c(10);
c.reset();
c.interval = 5.0;
14、never 和 void 的區別?
void 表示沒有任何類型(可以被賦值為 null 和 undefined)。
never 表示一個不包含值的類型,即表示永遠不存在的值。
擁有 void 返回值類型的函數能正常運行。擁有 never 返回值類型的函數無法正常返回,無法終止,或會拋出異常。
15、TS的學前基礎?
因為 TypeScript 是對 JavaScript 的擴展,更準確的說是 ECMAScript。所以,我們學習我們這套 TypeScript 的課程,需要具備 ECMAScript 語言的基礎:
熟悉語法基礎(變量、語句、函數等基礎概念)
掌握內置對象(Array、Date 等)的使用
面向對象基本概念(構造函數、原型、繼承)
- JavaScript
- 1. DOM事件流
- 2. 模擬 new, Object create(), bind
- 5. 封裝函數進行字符串駝峰命名的轉換
- 6. 什么是promise
- 7. 判斷一個數是否為數組
- 10. __proto__和prototype以及原型,原型鏈,構造函數
- 11. 繼承
- 12. 閉包
- 13. 回調函數
- 14. var 和 let 區別
- 15. this、bind、call、apply
- 16.undefined和null的區別
- 17.內存泄漏
- 18.垃圾回收機制
- html css
- 1. 元素垂直水平居中
- 2. 清除浮動
- 3. bootstrap柵格系統
- 4. px rpx em rem vw 的區別
- 5. 兩種盒子模型
- 6. 合集
- web類
- 1. html5的新特性以及理解(web標簽語義化)
- 2. 什么是路由,關于前端路由和后端路由
- 3. 對優質代碼的理解
- 4. cookie 和 sessionStorage和localStorage
- 5. 瀏覽器內核
- 6. http 狀態碼
- 7. href 和 src 的區別
- 8. link 和 @import 的區別
- 9. http 狀態碼
- 10. websocket
- 11. 瀏覽器解析url
- 12.http緩存
- vue
- 1.vue2和vue3有哪些區別
- 1. 對 mvvvm 的理解
- 2. mvvm的優缺點
- 3. 數據雙向綁定的原理
- 4. 生命周期
- 5. 組件如何通信
- 6. computed和watch的區別
- 7. proxy 和 Object.defineProperty
- 8. 虛擬dom和 diff算法
- 9. 路由的嵌套與傳參
- 10. 路由導航鉤子
- 11. axios 的理解
- 12. vue自定義指令 diretive
- 13. diff 的實現
- 14. 實現一個簡單的雙向綁定
- 15. 為什么 data 是一個函數
- 題譜
- js
- 手寫篇
- css
- vue
- react
- 算法
- 自我介紹
- 八股文
- 源項目地址
- 1.計算機網絡
- 2.瀏覽器
- 3.html和css
- 4.javascript
- 6.typescript
- 7.vue
- 8.react
- 大廠面試
- 面試題大全
- 常見性能優化
- 面試實戰
- 面試分析
- 押題
- 1.微前端在項目中的實際應用
- 2.性能優化
- vue相關
- 1.說一說HashRouter和HistoryRouter的區別和原理
- 無敵之路,牛客網面試題自測記錄
- 前端基礎
- 1.html
- 2.js基礎
- 珠峰性能優化
- WebWorker
- url到渲染
- 瀏覽器加載機制
- 自我介紹1
- 手寫題
- 1.compose
- 2.setTimeout模擬setInterval
- 3.手寫數組拍平
- 4.手寫promise.all
- 5.手寫深拷貝
- webpack
- 實戰