摘要:函數(shù)類型函數(shù)返回值類型我們可以給每個(gè)參數(shù)添加類型之后再為函數(shù)本身添加返回值類型。能夠根據(jù)返回語(yǔ)句自動(dòng)推斷出返回值類型,所以通??梢允÷运涿瘮?shù)完整函數(shù)類型完整的函數(shù)類型包含兩部分參數(shù)類型和返回值類型。
函數(shù)是 JavaScript 的第一等公民,函數(shù)在 JavaScript 中可以實(shí)現(xiàn)抽象層、模擬類、信息隱藏和模塊等等。TypeScript 在一定基礎(chǔ)上擴(kuò)展了函數(shù)的功能。
函數(shù)類型 函數(shù)返回值類型我們可以給每個(gè)參數(shù)添加類型之后再為函數(shù)本身添加返回值類型。TypeScript 能夠根據(jù)返回語(yǔ)句自動(dòng)推斷出返回值類型,所以通??梢允÷运?/p>
function add(x: number, y: number): number { return x + y; } // 匿名函數(shù) let myAdd = function(x: number, y: number): number { return x + y; };完整函數(shù)類型
完整的函數(shù)類型包含兩部分:參數(shù)類型和返回值類型。
// (x: number, y: number) => number 為函數(shù)的類型 // 其中的 x、y 只是為了增加可讀性,只要參數(shù)類型是匹配的,無(wú)需匹配參數(shù)名是否一樣 // 參數(shù)類型和返回值類型之間使用 => 符號(hào) let myAdd: (x: number, y: number) => number = function( x: number, y: number ): number { return x + y; };
返回值類型是函數(shù)類型的必要部分,函數(shù)沒(méi)有返回值的情況,也必須要指定返回值為 void。
推斷類型函數(shù)定義的時(shí)候,如果賦值語(yǔ)句只有一邊指定了語(yǔ)句,TypeScript 編譯器會(huì)自動(dòng)識(shí)別出類型:
// myAdd has the full function type let myAdd = function(x: number, y: number): number { return x + y; }; // The parameters `x` and `y` have the type number let myAdd: (baseValue: number, increment: number) => number = function(x, y) { return x + y; };
這叫做“按上下文歸類”,是類型推論的一種。
可選參數(shù)和默認(rèn)參數(shù)默認(rèn)情況下,TypeScript 會(huì)判斷傳入函數(shù)的參數(shù)和函數(shù)定義的參數(shù)是否一致,個(gè)數(shù)、類型都會(huì)進(jìn)行判斷。
let myAdd: (baseValue: number, increment: number) => number = function(x, y) { return x + y; }; // An argument for "increment" was not provided. myAdd(1); myAdd(1, 2); // 應(yīng)有 2 個(gè)參數(shù),但獲得 3 個(gè)。 myAdd(1, 2, 3);
在 TypeScript 中,可以加上 ? 實(shí)現(xiàn)可選參數(shù)的功能,可選參數(shù)必須放在必需參數(shù)的前面:
function buildName(firstName: string, lastName?: string) { if (lastName) { return firstName + " " + lastName; } else { return firstName; } } // Bob let result1 = buildName("Bob"); // 應(yīng)有 1-2 個(gè)參數(shù),但獲得 3 個(gè)。 let result2 = buildName("Bob", "Adams", "Sr."); // Bob Adams let result3 = buildName("Bob", "Adams");
在定義函數(shù)的時(shí)候,可以給形參進(jìn)行賦值作為默認(rèn)值,僅當(dāng)不傳值或傳入的值為 undefined 時(shí),函數(shù)會(huì)使用這個(gè)默認(rèn)值:
function buildName(firstName: string, lastName = "Smith") { return firstName + " " + lastName; } // Bob Smith let result1 = buildName("Bob"); // Bob Smith let result2 = buildName("Bob", undefined);
函數(shù)的默認(rèn)值不需要放到必需參數(shù)的后面,但是,放在必需參數(shù)前面的默認(rèn)值,只有顯式地傳遞 undefined 時(shí)會(huì)生效。
剩余參數(shù)在 JavaScript 中,可以使用 arguments 訪問(wèn)傳入的所有參數(shù);在 TypeScript 中同樣可以使用。
剩余參數(shù)將不定數(shù)量的參數(shù)當(dāng)作一個(gè)數(shù)組,表示 0 或多個(gè)參數(shù):
// ... 后面加上一個(gè)數(shù)組,這就是剩余參數(shù) function buildName(firstName: string, ...restOfName: string[]) { return firstName + " " + restOfName.join(" "); } // Bob console.log(buildName("Bob")); // Bob Smith Steven console.log(buildName("Bob", "Smith", "Steven"));
言下之意,剩余參數(shù)必須是最后的參數(shù),不能夠放到其他參數(shù)的前面。
重載重載允許一個(gè)函數(shù)接受不同數(shù)量或類型的參數(shù)時(shí),作出不同的處理。在 JavaScript 中,一般是判斷傳入?yún)?shù)的個(gè)數(shù)或類型等等情況實(shí)現(xiàn)重載。
以 TypeScript 中聯(lián)合類型的特性,實(shí)現(xiàn) JavaScript 版本的重載:
function reverse(x: number | string): number | string { if (typeof x === "number") { return Number( x .toString() .split("") .reverse() .join("") ); } return x .split("") .reverse() .join(""); } // function reverse(x: string | number): string | number console.log(reverse(123)); console.log(reverse("123"));
上面是是實(shí)現(xiàn)重載的一個(gè)方法,但是這樣實(shí)現(xiàn)重載更難懂,不能精確表達(dá)。TypeScript 提供更能精確表達(dá)的重載方法:
function reverse(x: number): number; function reverse(x: string): string; function reverse(x: number | string): number | string { if (typeof x === "number") { return Number( x .toString() .split("") .reverse() .join("") ); } return x .split("") .reverse() .join(""); } // function reverse(x: number): number (+1 overload) console.log(reverse(123)); // function reverse(x: string): string (+1 overload) console.log(reverse("123"));
注意,TypeScript 會(huì)優(yōu)先從最前面的函數(shù)定義開(kāi)始匹配,所以多個(gè)函數(shù)定義如果有包含關(guān)系,需要優(yōu)先把精確的定義寫在前面。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/106980.html
摘要:通常會(huì)定義為函數(shù)的返回值一個(gè)類型的變量是沒(méi)有生命用處的,因?yàn)轭愋偷淖兞恐荒苜x值為。和有一些區(qū)別的,函數(shù)沒(méi)有返回值時(shí)返回類型為的方法,即使沒(méi)有寫明語(yǔ)句,也會(huì)在函數(shù)執(zhí)行完的時(shí)候,隱式地返回一個(gè)類型。中新增加的變量聲明方式。 類型注解 類型注解使用 :TypeAnnotation 語(yǔ)法。類型聲明空間中可用的任何內(nèi)容都可以用作類型注解。 const num: number = 123; fun...
摘要:接口的作用是聲明變量的結(jié)構(gòu)和方法,但不做具體的實(shí)現(xiàn)。這兩個(gè)使用場(chǎng)景不同。額外的屬性檢查從字面上的意思看,其實(shí)就是對(duì)接口未定義的屬性進(jìn)行檢查。上面的例子,定義了接口,它具有索引簽名。它不會(huì)幫你檢查類是否具有某些私有成員。 接口的作用是聲明變量的結(jié)構(gòu)和方法,但不做具體的實(shí)現(xiàn)。通常,接口會(huì)強(qiáng)制對(duì)所有成員進(jìn)行類型檢查,包括數(shù)量和類型: interface Name { first: s...
摘要:抽象類抽象類做為其它字類的基類使用,一般不會(huì)直接被實(shí)例化。抽象類中可以包含具體實(shí)現(xiàn),接口不能。抽象類在運(yùn)行時(shí)是可見(jiàn)的,可以通過(guò)判斷。接口只能描述類的公共部分,不會(huì)檢查私有成員,而抽象類沒(méi)有這樣的限制。 一個(gè)普通的類 class Greeter { greeting: string; constructor(message: string) { this....
摘要:當(dāng)你陷在一個(gè)中大型項(xiàng)目中時(shí)應(yīng)用日趨成為常態(tài),沒(méi)有類型約束類型推斷,總有種牽一發(fā)而動(dòng)全身的危機(jī)和束縛。總體而言,這些付出相對(duì)于代碼的健壯性和可維護(hù)性,都是值得的。目前主流的都為的開(kāi)發(fā)提供了良好的支持,比如和。參考資料中文文檔 文章博客地址:http://pinggod.com/2016/Typescript/ TypeScript 是 JavaScript 的超集,為 JavaScrip...
摘要:當(dāng)滿足以下條件時(shí),枚舉成員被當(dāng)作是常數(shù)不具有初始化函數(shù)并且之前的枚舉成員是常數(shù)。在這種情況下,當(dāng)前枚舉成員的值為上一個(gè)枚舉成員的值加。但第一個(gè)枚舉元素是個(gè)例外。枚舉成員使用常數(shù)枚舉表達(dá)式初始化。 數(shù)字類型枚舉 常規(guī)枚舉的值都是數(shù)字類型,因此被稱為數(shù)字類型枚舉: enum Color { Red, Blue, Green } console.log(Color.R...
閱讀 3566·2021-11-15 11:38
閱讀 909·2021-11-08 13:27
閱讀 2333·2021-07-29 14:50
閱讀 3049·2019-08-29 13:06
閱讀 892·2019-08-29 11:22
閱讀 2467·2019-08-29 11:04
閱讀 3568·2019-08-28 18:23
閱讀 958·2019-08-26 13:46