typescript面試題

1、什么是Typescript?

TypeScript是一種由微軟開發(fā)和維護(hù)的免費開源編程語言。它是一個強類型的JavaScript超集,可編譯為純JavaScript。它是一種用于應(yīng)用級JavaScript開發(fā)的語言。對于熟悉c#、Java和所有強類型語言的開發(fā)人員來說,TypeScript非常容易學(xué)習(xí)和使用。

TypeScript可以在任何瀏覽器、主機和操作系統(tǒng)上執(zhí)行。TypeScript不是直接在瀏覽器上運行的。它需要一個編譯器來編譯和生成JavaScript文件。TypeScript是帶有一些附加特性的ES6 JavaScript版本。

2、TypeScript和JavaScript有什么不同?

TypeScript與JavaScript的區(qū)別如下:

| 編號 | JavaScript | TypeScript |
| 1 | 它是由網(wǎng)景公司在1995年開發(fā)的。 | 它是2012年由安德斯·海爾斯伯格(Anders Hejlsberg)開發(fā)的。 |
| 2 | JavaScript源文件在”。js”擴(kuò)展。 | TypeScript源文件是”.ts”擴(kuò)展名。 |
| 3 | JavaScript不支持ES6。 | TypeScript 支持ES6。 |
| 4 | 它不支持強類型或靜態(tài)類型。 | 它支持強類型或靜態(tài)類型特性。 |
| 5 | 它只是一種腳本語言。 | 它支持面向?qū)ο蟮木幊谈拍?,如類、接口、繼承、泛型等。 |
| 6 | JavaScript沒有可選的參數(shù)特性。 | TypeScript有可選的參數(shù)特性。 |
| 7 | 它是解釋語言,這就是為什么它在運行時突出顯示錯誤。 | 它編譯代碼并在開發(fā)期間突出顯示錯誤。 |
| 8 | JavaScript不支持模塊。 | TypeScript支持模塊。 |
| 9 | 在這里,number和string是對象。 | 在這里,number和string是接口。 |
| 10 | JavaScript不支持泛型。 | TypeScript支持泛型。 |

3、我們?yōu)槭裁葱枰猅ypeScript?

我們需要TypeScript:

  • TypeScript快速、簡單,最重要的是,容易學(xué)習(xí)。
  • TypeScript支持面向?qū)ο蟮木幊烫匦?,比如類、接口、繼承、泛型等等。
  • TypeScript在編譯時提供了錯誤檢查功能。它將編譯代碼,如果發(fā)現(xiàn)任何錯誤,它將在運行腳本之前突出顯示這些錯誤。
  • TypeScript支持所有JavaScript庫,因為它是JavaScript的超集。
  • TypeScript通過使用繼承來支持可重用性。
  • TypeScript使應(yīng)用程序開發(fā)盡可能的快速和簡單,并且TypeScript的工具支持為我們提供了自動完成、類型檢查和源文檔。
  • TypeScript支持最新的JavaScript特性,包括ECMAScript 2015。
  • TypeScript提供了ES6的所有優(yōu)點和更高的生產(chǎn)力。
  • TypeScript支持靜態(tài)類型、強類型、模塊、可選參數(shù)等。

4、列出Typescript的一些特性

Typescript的一些特性

5、列出使用Typescript的一些優(yōu)點?## 5、列出使用Typescript的一些優(yōu)點?

TypeScript有以下優(yōu)點。

  • 它提供了可選靜態(tài)類型的優(yōu)點。在這里,Typescript提供了可以添加到變量、函數(shù)、屬性等的類型。
  • Typescript能夠編譯出一個能在所有瀏覽器上運行的JavaScript版本。
  • TypeScript總是在編譯時強調(diào)錯誤,而JavaScript在運行時指出錯誤。
  • TypeScript支持強類型或靜態(tài)類型,而這不是在JavaScript中。
  • 它有助于代碼結(jié)構(gòu)。
  • 它使用基于類的面向?qū)ο缶幊獭?/li>
  • 它提供了優(yōu)秀的工具支持和智能感知,后者在添加代碼時提供活動提示。
  • 它通過定義模塊來定義名稱空間概念。

6、Typescript的缺點是什么?

TypeScript有以下缺點:

  • TypeScript需要很長時間來編譯代碼。
  • TypeScript不支持抽象類。
  • 如果我們在瀏覽器中運行TypeScript應(yīng)用程序,需要一個編譯步驟將TypeScript轉(zhuǎn)換成JavaScript。
  • Web開發(fā)人員使用了幾十年的JavaScript,而TypeScript不是都是新東西。
  • 要使用任何第三方庫,必須使用定義文件。并不是所有第三方庫都有可用的定義文件。
  • 類型定義文件的質(zhì)量是一個問題,即如何確保定義是正確的?

7、 TypeScript的不同組件是什么?

TypeScript主要有三個組件。這些都是- –

TypeScript所有組件

語言language

該語言由新語法、關(guān)鍵字、類型注釋等元素組成,允許我們編寫TypeScript。

編譯器compiler

TypeScript編譯器是開源的、跨平臺的,是用TypeScript編寫的。它將用TypeScript編寫的代碼轉(zhuǎn)換為JavaScript代碼。它執(zhí)行從TypeScript代碼到JavaScript代碼的解析和類型檢查。它還可以幫助將不同的文件連接到單個輸出文件,并生成源映射。

語言服務(wù)language service

語言服務(wù)提供信息,幫助編輯器和其他工具提供更好的輔助功能,如自動重構(gòu)和智能感知。

8、Typescript是誰開發(fā)的,目前穩(wěn)定的Typescript版本是什么?

typescript是由Anders Hejlsberg開發(fā)的,他也是c#語言開發(fā)團(tuán)隊的核心成員之一。typescript于2012年10月1日發(fā)布,被標(biāo)記為0.8版。它是由Microsoft在Apache 2許可下開發(fā)和維護(hù)的。它是為開發(fā)大型應(yīng)用程序而設(shè)計的。

目前穩(wěn)定的TypeScript版本是3.2,于2018年9月30日發(fā)布。Typescript編譯成簡單的JavaScript代碼,可以在任何支持ECMAScript 2015框架的瀏覽器上運行。它支持最新的和不斷發(fā)展的JavaScript特性。

9、說說安裝Typescript的最低要求。或者我們?nèi)绾潍@得TypeScript并安裝它?

TypeScript可以通過npm (node .js包管理器)在node的幫助下進(jìn)行安裝和管理。要安裝TypeScript,首先要確保npm安裝正確,然后運行以下命令在系統(tǒng)上全局安裝TypeScript。

$ npm install -g typescript  

它安裝一個命令行代碼“tsc”,它將進(jìn)一步用于編譯我們的Typescript代碼。確保檢查系統(tǒng)上安裝的Typescript版本。

安裝TypeScript需要以下步驟:

  • 下載并運行節(jié)點的.msi安裝程序。
  • 輸入命令“node -v”檢查安裝是否成功。
  • 在終端窗口中輸入以下命令安裝Typescript: $ npm install -g Typescript

10、列出在Typescript中的內(nèi)置類型

在Typescript中,內(nèi)置的數(shù)據(jù)類型也稱為原始數(shù)據(jù)類型。這些數(shù)據(jù)如下所示。

typescript內(nèi)置數(shù)據(jù)類型02

數(shù)字類型: 用于表示數(shù)字類型值。TypeScript中的所有數(shù)字都存儲為浮點值。

語法: let標(biāo)識符:number = value;

字符串類型: 它表示存儲為Unicode UTF-16代碼的字符序列。我們通過將字符串括在單引號或雙引號中來在腳本中包含字符串。

語法: let標(biāo)識符:字符串= ” “;

布爾類型: 用于表示邏輯值。當(dāng)我們使用布爾類型時,我們只得到真或假的輸出。布爾值是一個真值,它指定條件是否為真。

語法: let標(biāo)識符:bool =布爾值;

Null類型: Null表示值未定義的變量。不能直接引用空類型值本身??疹愋蜎]有用處,因為我們只能為它分配一個空值。

語法: let num: number = null;

未定義類型: 它是未定義字面量的類型。未定義的類型表示所有未初始化的變量。它是沒有用的,因為我們只能分配一個未定義的值給它。這種內(nèi)置類型是所有類型的子類型。

語法: let num: number =未定義;

Void類型: Void是不返回任何類型值的函數(shù)的返回類型。如果沒有可用的數(shù)據(jù)類型,則使用它。

語法: let unusable:void =未定義;

11、Typescript中的變量是什么?如何在Typescript中創(chuàng)建變量?

變量是存儲位置,用于存儲要被程序引用和使用的值/信息。它充當(dāng)程序中值的容器。可以使用var關(guān)鍵字聲明它。它應(yīng)該在使用前聲明。在Typescript中聲明變量時,應(yīng)該遵循某些規(guī)則-

  • 變量名必須是字母或數(shù)字。
  • 變量名不能以數(shù)字開頭。
  • 變量名不能包含空格和特殊字符,除了下劃線(_)和美元($)符號。

我們可以通過以下四種方式之一聲明一個變量:

  • 在一條語句中聲明類型和值。語法:var [identifier]: [type-annotation] = value;
  • 聲明沒有值的類型。語法:var [identifier]: [type-annotation];
  • 在沒有類型的情況下聲明它的值。語法:var [identifier] = value;
  • 聲明沒有值和類型。語法:var(標(biāo)識符);

12、如何編譯Typescript文件?

下面是將Typescript文件編譯成JavaScript時所遵循的命令。

$ tsc <TypeScript File Name>  

例如,編譯“hello .ts”。

$ tsc helloworld.ts  

結(jié)果是helloworld.js。

13、是否可以將多個.ts文件合并成一個.js文件?如果是,那么如何做?

是的,有可能。為此,我們需要添加——outFILE [OutputJSFileName]編譯選項。

$ tsc --outFile comman.js file1.ts file2.ts file3.ts  

上面的命令將編譯所有這三個.ts文件和結(jié)果將存儲在一個comman.js文件中,在這種情況下,當(dāng)我們不提供輸出文件名像下面的命令。

$ tsc --outFile file1.ts file2.ts file3.ts  

然后file2.ts和file3.ts將被編譯,并將輸出放在file1.ts中,現(xiàn)在是file1.ts包含JavaScript代碼。

14、能否自動編譯.ts文件,并實時修改.ts文件?

這是可以的,自動實時根據(jù).ts文件變化自動編譯.ts文件是可以的。這可以通過使用——watch compiler選項來實現(xiàn)

tsc --watch file1.ts  

上面的命令首先編譯file1為file1.js,并注意文件的變化,如果檢測到任何更改,它將再次編譯文件。這里,我們需要確保在使用——watch選項運行時命令提示符不能關(guān)閉。

15、TS的接口是什么意思?參照TS來解釋它們。

接口是在我們的應(yīng)用程序中充當(dāng)契約的結(jié)構(gòu)。它定義了要遵循的類的語法,這意味著實現(xiàn)接口的類必須實現(xiàn)它的所有成員。它不能被實例化,但是可以被實現(xiàn)它的類對象引用。無論對象是否具有特定的結(jié)構(gòu),TypeScript編譯器都使用接口進(jìn)行類型檢查(也稱為“duck typing”鴨子類型或“結(jié)構(gòu)化子類型”)。

語法:

interface interface_name {    
          // 字段聲明
          // 方法聲明
}    

接口只是聲明方法和字段,它不能用來建造任何東西。不需要將接口轉(zhuǎn)換為JavaScript來執(zhí)行,它們對運行時JavaScript沒有任何影響。因此,它們的唯一目的是在開發(fā)階段提供幫助。

16、你如何理解Typescript中的類?列出類的一些特性。

我們知道,TypeScript是一種面向?qū)ο蟮腏avaScript語言,支持OOP編程特性,比如類、接口等。與Java一樣,類是用于創(chuàng)建可重用組件的基本實體。它是一組具有公共屬性的對象。類是創(chuàng)建對象的模板或藍(lán)圖。它是一個邏輯實體。“class”關(guān)鍵字用于在Typescript中聲明一個類。

例子:

class Student {    
    studCode: number;    
    studName: string;    
    constructor(code: number, name: string) {    
            this.studName = name;    
            this.studCode = code;    
    }    
    getGrade() : string {    
        return "A+" ;    
    }    
}    

類的特征是-

  • 繼承
  • 封裝
  • 多態(tài)性
  • 抽象

17、本地Javascript支持模塊嗎?

不。目前,本地JavaScript不支持模塊。為了在Javascript中創(chuàng)建和使用模塊,我們需要一個像CommonJS這樣的外部模塊。

18、TypeScript支持哪些面向?qū)ο蟮男g(shù)語?

TypeScript支持以下面向?qū)ο蟮男g(shù)語。

  • 模塊
  • 接口
  • 繼承
  • 數(shù)據(jù)類型
  • 成員函數(shù)

19、如何從TypeScript的子類調(diào)用基類構(gòu)造函數(shù)?

super()函數(shù)的作用是: 從子類中調(diào)用父類或基類構(gòu)造函數(shù)。

20、如何在TypeScript中實現(xiàn)繼承?

繼承是一種從另一個類獲取一個類的屬性和行為的機制。它是OOPs語言的一個重要方面,并且具有從現(xiàn)有類創(chuàng)建新類的能力,繼承成員的類稱為基類,繼承這些成員的類稱為派生類。

繼承可以通過使用extend關(guān)鍵字來實現(xiàn)。我們可以通過下面的例子來理解它。

class Shape {     
   Area:number     
   constructor(area:number) {     
      this.Area = area    
   }     
}     
class Circle extends Shape {     
   display():void {     
      console.log("圓的面積: "+this.Area)     
   }     
}    
var obj = new Circle(320);     
obj.display()  

21、Typescript中的模塊是什么?

模塊是創(chuàng)建一組相關(guān)變量、函數(shù)、類和接口等的強大方法。它可以在它們自己的范圍內(nèi)執(zhí)行,而不是在全局范圍內(nèi)。換句話說,在模塊中聲明的變量、函數(shù)、類和接口不能在模塊外部直接訪問。

創(chuàng)建一個模塊

可以使用export關(guān)鍵字創(chuàng)建模塊,也可以在其他模塊中使用import關(guān)鍵字。

module module_name{  
    class xyz{  
        export sum(x, y){  
            return x+y;  
         }  
    }  
}  

22、內(nèi)部模塊和外部模塊有什么區(qū)別?

內(nèi)部模塊與外部模塊的區(qū)別如下:

| 編號 | 內(nèi)部模塊 | 外部模塊 |
| 1 | 內(nèi)部模塊用于將類、接口、函數(shù)和變量邏輯地分組到一個單元中,并可以導(dǎo)出到另一個模塊中。 | 外部模塊用于隱藏模塊定義的內(nèi)部語句,并且只顯示與聲明的變量相關(guān)的方法和參數(shù)。 |
| 2 | 內(nèi)部模塊在Typescript的早期版本中。但是在最新版本的TypeScript中使用名稱空間仍然支持它們。 | 外部模塊在最新版本的TypeScript中稱為模塊。 |
| 3 | 內(nèi)部模塊是其他模塊(包括全局模塊和外部模塊)的本地或?qū)С龀蓡T。 | 外部模塊是使用外部模塊名稱引用的單獨加載的代碼體。 |
| 4 | 內(nèi)部模塊使用指定其名稱和主體的moduledeclaration來聲明。 | 外部模塊被編寫為一個單獨的源文件,其中包含至少一個導(dǎo)入或?qū)С雎暶鳌?|
| 5 | 例子: module Sum { export function add(a, b) { console.log(“Sum: ” +(a+b)); } } | 例子: export class Addition{ constructor(private x?: number, private y?: number){ } Sum(){ console.log(“SUM: ” +(this.x + this.y)); } } |

23、Typescript中的名稱空間是什么?如何在Typescript中聲明名稱空間?

名稱空間是用于對功能進(jìn)行邏輯分組的一種方式。名稱空間用于在內(nèi)部維護(hù)typescript的遺留代碼。它封裝了共享某些關(guān)系的特性和對象。名稱空間也稱為內(nèi)部模塊。名稱空間還可以包括接口、類、函數(shù)和變量,以支持一組相關(guān)功能。

注意: 名稱空間可以在多個文件中定義,并允許將每個文件都定義在一個地方。它使代碼更容易維護(hù)。

用于創(chuàng)建名稱空間的語法

namespace <namespace_name> {    
           export interface I1 { }    
           export class c1{ }    
}    

24、解釋在TypeScript中的裝飾器?

修飾符是一種特殊類型的聲明,可以應(yīng)用于類、方法、訪問器、屬性或參數(shù)。修飾符只是以@expression符號為前綴的函數(shù),其中表達(dá)式必須求值為一個函數(shù),該函數(shù)將在運行時用有關(guān)修飾聲明的信息調(diào)用。

TypeScript裝飾器以聲明的方式將注釋和元數(shù)據(jù)添加到現(xiàn)有代碼中。裝飾器是為ES7提出的一個實驗性特性。它已經(jīng)被一些JavaScript框架使用,包括Angular 2。裝飾器在未來的版本中可能會改變。

要啟用對decorator的實驗支持,我們必須在命令行或在我們的tsconfig.json中啟用experimental aldecorators編譯器選項:

命令行

$tsc --target ES5 --experimentalDecorators    

tsconfig.json

{    
    "compilerOptions": {    
        "target": "ES5",    
        "experimentalDecorators": true    
    }    
}    

25、什么是混合mixin?

在Javascript中,mixin是一種從可重用組件構(gòu)建類的方法,通過組合稱為mixin的更簡單的部分類來構(gòu)建它們。

這個想法很簡單,不是類a擴(kuò)展類B來獲得它的功能,而是函數(shù)B獲取類a并返回一個新類,這個類具有這個添加的功能。函數(shù)B是一個混合函數(shù)。

26、TypeScript類中屬性/方法的默認(rèn)可見性是什么?

Public是TypeScript類中屬性/方法的默認(rèn)可見性。

27、TypeScript是如何在函數(shù)中支持可選參數(shù)的?

與JavaScript不同,如果我們試圖調(diào)用一個函數(shù)而不提供其函數(shù)簽名中聲明的參數(shù)的確切數(shù)量和類型,那么TypeScript編譯器將拋出一個錯誤。為了克服這個問題,我們可以通過使用問號符號(‘?’)來使用可選參數(shù)。這意味著可以或不可以接收值的參數(shù)可以附加一個’?”“可選的。

function Demo(arg1: number, arg2? :number) {              
}因此,arg1總是必需的,而arg2是一個可選參數(shù)  

因此,arg1總是必需的,而arg2是一個可選參數(shù)。

注意: 可選參數(shù)必須遵循要求的參數(shù)。如果我們想讓arg1成為可選的,而不是arg2,那么我們需要改變順序,arg1必須放在arg2之后。

function Demo(arg2: number, arg1? :number) {  
}  

28、JavaScript不支持函數(shù)重載,但TypeScript是否支持函數(shù)重載?

是的,TypeScript支持函數(shù)重載。但是它的實現(xiàn)很奇怪,當(dāng)我們在TypeScript中執(zhí)行函數(shù)重載時,我們只能實現(xiàn)一個帶有多個簽名的函數(shù)。

//帶有字符串類型參數(shù)的函數(shù)  
function add(a:string, b:string): string;    

//帶有數(shù)字類型參數(shù)的函數(shù)
function add(a:number, b:number): number;    

//函數(shù)定義
function add(a: any, b:any): any {    
    return a + b;    
}    

在上面的例子中,前兩行是函數(shù)重載聲明。它有兩次重載,第一個簽名的參數(shù)類型為string,而第二個簽名的參數(shù)類型為number。第三個函數(shù)包含實際實現(xiàn)并具有any類型的參數(shù)。任何數(shù)據(jù)類型都可以接受任何類型的數(shù)據(jù)。然后,實現(xiàn)檢查所提供參數(shù)的類型,并根據(jù)供應(yīng)商參數(shù)類型執(zhí)行不同的代碼段。

29、可以調(diào)試任何TypeScript文件嗎?

是的。要調(diào)試任何TypeScript文件,我們需要.js源映射文件。因此,使用—sourcemap標(biāo)志編譯.ts文件以生成源映射文件。

$ tsc -sourcemap file1.ts  

這將創(chuàng)建file1.js和file1.js.map,而file1.js的最后一行是源映射文件的引用。

//# sourceMappingURL=file1.js.map  

30、什么是TypeScript定義管理器?為什么我們需要它?

TypeScript定義管理器(TSD)是一個包管理器,用于直接從社區(qū)驅(qū)動的DefinitelyTyped庫中搜索和安裝TypeScript定義文件。

假設(shè)我們想在.ts文件中使用一些jQuery代碼。

$(document).ready(function() { //Your jQuery code });  

現(xiàn)在,當(dāng)我們嘗試使用tsc編譯它時,它會給出一個編譯時錯誤: 找不到名稱“”。因此,我們需要通知TypeScript編譯器“”屬于jQuery。要做到這一點,TSD就要發(fā)揮作用。我們可以下載jQuery類型定義文件并將其包含在.ts文件中。以下是實現(xiàn)這一目標(biāo)的步驟:

首先,安裝TSD中。

$ npm install tsd -g  

在TypeScript目錄中,通過運行創(chuàng)建一個新的TypeScript項目

$ tsd init  

然后安裝jQuery的定義文件。

tsd query jquery --action install  

上面的命令將下載并創(chuàng)建一個包含以“.d.ts”結(jié)尾的jQuery定義文件的新目錄?,F(xiàn)在,通過更新TypeScript文件以指向jQuery定義來包含定義文件。

/// <reference path="typings/jquery/jquery.d.ts" />  
$(document).ready(function() { //To Do  
});  

現(xiàn)在,再次編譯。這次將生成js文件,沒有任何錯誤。因此,TSD的需要幫助我們獲得所需框架的類型定義文件。

31、什么是TypeScript Declare關(guān)鍵字?

我們知道所有的JavaScript庫/框架都沒有TypeScript聲明文件,但是我們希望在TypeScript文件中使用它們時不會出現(xiàn)編譯錯誤。為此,我們使用declare關(guān)鍵字。在我們希望定義可能存在于其他地方的變量的環(huán)境聲明和方法中,可以使用declare關(guān)鍵字。

例如,假設(shè)我們有一個名為myLibrary的庫,它沒有TypeScript聲明文件,在全局命名空間中有一個名為myLibrary的命名空間。如果我們想在TypeScript代碼中使用這個庫,我們可以使用以下代碼:

declare var myLibrary;  

TypeScript運行時將把myLibrary變量賦值為任意類型。這是一個問題,我們不會得到智能感知在設(shè)計時,但我們將能夠使用庫在我們的代碼。

32、如何從任何.ts文件生成TypeScript定義文件?

我們可以使用tsc編譯器從任何.ts文件生成TypeScript定義文件。它將生成一個TypeScript定義,使我們的TypeScript文件可重用。

tsc --declaration file1.ts  

33、什么是tsconfig.son文件嗎?

tsconfig.son文件是json格式的文件。tsconfig.json文件中,我們可以指定各種選項告訴編譯器如何編譯當(dāng)前項目。目錄中存在tsconfig.json文件,表明該目錄是TypeScript項目的根目錄。 下面是一個示例tsconfig.json文件。

{  
   "compilerOptions": {  
      "declaration": true,      
      "emitDecoratorMetadata": false,      
      "experimentalDecorators": false,      
      "module": "none",      
      "moduleResolution": "node"  
      "removeComments": true,  
      "sourceMap": true  
   },  
   "files": [  
      "main.ts",  
      "othermodule.ts"  
    ]  
}  

34、解釋TypeScript中的泛型?

TypeScript泛型是一個提供創(chuàng)建可重用組件方法的工具。它能夠創(chuàng)建可以處理多種數(shù)據(jù)類型而不是單一數(shù)據(jù)類型的組件。泛型在不影響性能或生產(chǎn)率的情況下提供類型安全性。泛型允許我們創(chuàng)建泛型類、泛型函數(shù)、泛型方法和泛型接口。

在泛型中,類型參數(shù)寫在開(<)和閉(>)括號之間,這使得它是強類型集合。泛型使用一種特殊類型的類型變量<T>,它表示類型。泛型集合只包含類似類型的對象。

function identity<T>(arg: T): T {      
    return arg;      
}      
let output1 = identity<string>("myString");      
let output2 = identity<number>( 100 );    
console.log(output1);    
console.log(output2);     

35、TypeScript是否支持所有面向?qū)ο蟮脑瓌t?

是的,TypeScript支持所有面向?qū)ο蟮脑瓌t。面向?qū)ο缶幊逃兴膫€主要原則:

  • 封裝,
  • 繼承,
  • 抽象,
  • 多態(tài)性。

36、如何檢查TypeScript中的null和undefined ?

通過使用一個緩沖檢查,我們可以檢查空和未定義:

if (x == null) {  
}  

如果我們使用嚴(yán)格的檢查,它將總是對設(shè)置為null的值為真,而對未定義的變量不為真。

例子

var a: number;  
var b: number = null;  
function check(x, name) {  
    if (x == null) {  
        console.log(name + ' == null');  
    }  
    if (x === null) {  
        console.log(name + ' === null');  
    }  
    if (typeof x === 'undefined') {  
        console.log(name + ' is undefined');  
    }  
}  
check(a, 'a');  
check(b, 'b');  

輸出

"a == null"  
"a is undefined"  
"b == null"  
"b === null"  

37、我們可以在后端使用TypeScript嗎?如果可以,如何使用?

是的,我們可以在后端使用TypeScript。我們可以通過下面的例子來理解它。在這里,我們選擇Node.js,并具有一些額外的類型安全性和該語言帶來的其他抽象。

安裝TypeScript編譯器

npm i -g typescript  

TypeScript編譯器接受tsconfig.json文件中的選項,此文件確定將構(gòu)建的文件放在何處。

{  
  "compilerOptions": {  
    "target": "es5",  
    "module": "commonjs",  
    "declaration": true,  
    "outDir": "build"  
  }  
}  

編譯ts文件

tsc  

運行

node build/index.js  

38、TS的“接口”和“type”語句有什么區(qū)別?

nterface X {  
    a: number  
    b: string  
}  
type X = {  
    a: number  
    b: string  
};  

| 編號 | 接口 | Type****類型 |
| 1 | 接口聲明總是引入指定的對象類型。 | 類型別名聲明可以為任何類型(包括基元類型、聯(lián)合類型和交集類型)引入名稱。 |
| 2 | 接口可以在extends或implements子句中命名。 | 對象類型文字的類型別名不能在“擴(kuò)展”或“實現(xiàn)”子句中命名。 |
| 3 | 接口創(chuàng)建一個到處使用的新名稱。 | 類型別名不創(chuàng)建新名稱。 |
| 4 | 一個接口可以有多個合并聲明。 | 對象類型字面量的類型別名不能有多個合并聲明。 |

39、TypeScript中的環(huán)境是什么?何時使用它?

環(huán)境聲明告訴編譯器其他地方存在的實際源代碼。如果這些源代碼在運行時不存在,而我們嘗試使用它們,則它將中斷而不會發(fā)出警告。

環(huán)境聲明文件類似于docs文件。如果源更改,則還需要保持文檔更新。如果環(huán)境聲明文件未更新,那么我們將得到編譯器錯誤。

Ambient聲明使我們能夠安全輕松地使用現(xiàn)有流行的JavaScript庫,例如jquery,angularjs,nodejs等。

40、什么是TypeScript映射文件?

  • TypeScript Map文件是一個源映射文件,其中包含有關(guān)我們原始文件的信息。
  • .map文件是源映射文件,可讓工具在發(fā)出的JavaScript代碼和創(chuàng)建它的TypeScript源文件之間進(jìn)行映射。
  • 許多調(diào)試器可以使用這些文件,因此我們可以調(diào)試TypeScript文件而不是JavaScript文件。

41、什么是TypeScript中的類型斷言?

類型斷言的工作方式類似于其他語言中的類型轉(zhuǎn)換,但是它不像其他語言一樣執(zhí)行C#和Java那樣的類型檢查或數(shù)據(jù)重組。類型轉(zhuǎn)換附帶運行時支持,而類型斷言對運行時沒有影響。但是,類型斷言僅由編譯器使用,并向編譯器提供有關(guān)我們希望如何分析代碼的提示。

let empCode: any = 111;     
let employeeCode = <number> code;     
console.log(typeof(employeeCode)); // : number  

42、TypeScript的as語法是什么?

as是TypeScript中類型斷言的附加語法,引入as-語法的原因是原始語法(<type>)與JSX沖突。

例子

et empCode: any = 111;     
let employeeCode = code as number;   

當(dāng)使用帶有JSX的TypeScript時,只允許as風(fēng)格的斷言。

43、什么是JSX?我們可以在TypeScript中使用JSX嗎?

JSX只不過是帶有不同擴(kuò)展名的Javascript。Facebook提出了這個新的擴(kuò)展,以便與JavaScript中類似xml的HTML實現(xiàn)區(qū)分開來。

JSX是一種可嵌入的類似xml的語法。它將被轉(zhuǎn)換成有效的JavaScript。JSX隨著React框架而流行起來。TypeScript支持嵌入、類型檢查和直接將JSX編譯成JavaScript。

要使用JSX,我們必須做兩件事。

  • 使用.tsx擴(kuò)展名命名文件
  • 啟用jsx選項

44、什么是Rest參數(shù)?

rest參數(shù)用于向函數(shù)傳遞零個或多個值。它是通過在參數(shù)前加上三個點字符(‘…’)來聲明的。它允許函數(shù)在不使用arguments對象的情況下?lián)碛锌勺償?shù)量的參數(shù)。當(dāng)我們有不確定數(shù)量的參數(shù)時,這是非常有用的。

rest參數(shù)要遵循的規(guī)則:

  • 一個函數(shù)中只允許有一個rest參數(shù)。
  • 它必須是數(shù)組類型。
  • 它必須是參數(shù)列表中的最后一個參數(shù)。
function sum(a: number, ...b: number[]): number {    
 let result = a;    
 for (var i = 0; i < b.length; i++) {    
 result += b[i];    
 }    
 console.log(result);    
}    
let result1 = sum(3, 5);    
let result2 = sum(3, 5, 7, 9);   

45、解釋TypeScript的Enum枚舉類型?

枚舉或枚舉是一種數(shù)據(jù)類型,允許我們定義一組命名常量。使用枚舉可以更容易地記錄意圖,或者創(chuàng)建一組不同的案例。它是相關(guān)值的集合,可以是數(shù)值或字符串值。

例子

enum Gender {  
  Male,  
  Female  
  Other  
}  
console.log(Gender.Female); // : 1  
// 我們還可以通過enum值的number值來訪問它
console.log(Gender[1]); // : Female  

46、解釋相對模塊和非相對模塊的導(dǎo)入

| 非相對 | 相對 |
| 非相對導(dǎo)入可以相對于baseUrl解析,也可以通過路徑映射解析。換句話說,我們在導(dǎo)入任何外部依賴項時使用非相對路徑。 例子****:import * as $ from “jquery”; import { Component } from “@angular/core”; | 相對導(dǎo)入可以用于我們自己的模塊,這些模塊保證在運行時維護(hù)它們的相對位置。相對導(dǎo)入以/、./或../開頭。 例子: import Entry from “./components/Entry”; import {DefaultHeaders} from “../constants/http”; |

47、什么是匿名函數(shù)?

匿名函數(shù)是聲明時沒有任何命名標(biāo)識符的函數(shù)。這些函數(shù)是在運行時動態(tài)聲明的。與標(biāo)準(zhǔn)函數(shù)一樣,匿名函數(shù)可以接受輸入和返回輸出。匿名函數(shù)在初始創(chuàng)建之后通常是不可訪問的。

例子

let myAdd = function(x: number, y: number): number {   
return x + y;   
};  
console.log(myAdd())  

48、什么是聲明合并?

聲明合并是編譯器隨后合并兩個或多個獨立聲明的過程。將具有相同名稱的聲明聲明為單個定義。這個合并的定義具有兩個原始聲明的特性。

最簡單也是最常見的聲明合并類型是接口合并。在最基本的層次上,merge將兩個聲明的成員機械地連接到一個具有相同名稱的接口中。

例子

interface Cloner {  
    clone(animal: Animal): Animal;  
}  
interface Cloner {  
    clone(animal: Sheep): Sheep;  
}  
interface Cloner {  
    clone(animal: Dog): Dog;  
    clone(animal: Cat): Cat;  
}  

這三個接口將合并為一個單獨的聲明

interface Cloner {  
    clone(animal: Dog): Dog;  
    clone(animal: Cat): Cat;  
    clone(animal: Sheep): Sheep;  
    clone(animal: Animal): Animal;  
}  

注: 在TypeScript中不是所有的合并都允許。目前,類不能與其他類或變量合并。

49、TypeScript中的方法重寫是什么?

如果子類(子類)具有與父類中聲明的相同的方法,則稱為方法覆蓋。換句話說,在派生類或子類中重新定義基類方法。

方法重寫的規(guī)則

  • 該方法必須具有與父類相同的名稱
  • 該方法必須具有與父類相同的參數(shù)。
  • 必須有一個IS-A關(guān)系(繼承)。

例子

class NewPrinter extends Printer {  
    doPrint(): any {  
        super.doPrint();  
        console.log("Called Child class.");  
    }  
    doInkJetPrint(): any {  
        console.log("Called doInkJetPrint().");  
    }  
}  
let printer: new () => NewPrinter;  
printer.doPrint();  
printer.doInkJetPrint();  

50、Lambda/箭頭函數(shù)是什么?

ES6版本的TypeScript提供了定義匿名函數(shù)的簡寫語法,也就是用于函數(shù)表達(dá)式。這些箭頭函數(shù)也稱為Lambda函數(shù)。lambda函數(shù)是沒有名稱的函數(shù),箭頭函數(shù)省略了function關(guān)鍵字。

例子

let sum = (a: number, b: number): number => {    
            return a + b;    
}    
console.log(sum(20, 30)); //returns 50    

在上面,?=>?是一個lambda操作符,(a + b)是函數(shù)的主體,(a: number, b: number)是內(nèi)聯(lián)參數(shù)。

TypeScript有以下優(yōu)點。

  • 它提供了可選靜態(tài)類型的優(yōu)點。在這里,Typescript提供了可以添加到變量、函數(shù)、屬性等的類型。
  • Typescript能夠編譯出一個能在所有瀏覽器上運行的JavaScript版本。
  • TypeScript總是在編譯時強調(diào)錯誤,而JavaScript在運行時指出錯誤。
  • TypeScript支持強類型或靜態(tài)類型,而這不是在JavaScript中。
  • 它有助于代碼結(jié)構(gòu)。
  • 它使用基于類的面向?qū)ο缶幊獭?/li>
  • 它提供了優(yōu)秀的工具支持和智能感知,后者在添加代碼時提供活動提示。
  • 它通過定義模塊來定義名稱空間概念。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容