TypeScript 函数
2022年9月29日大约 2 分钟
TypeScript 函数
函数类型
let myAdd: (baseValue:number, increment:number) => number = function(x: number, y: number): number { return x + y; };
(baseValue:number, increment:number) // 参数及参数类型
=> number // 返回值 及返回值类型
// 返回值类型是函数类型的必要部分,如果函数没有返回任何值,你也必须指定返回值类型为 void而不能留空
可选参数和默认参数
TypeScript里的每个函数参数都是必须的。传递给一个函数的参数个数必须与函数期望的参数个数一致。
// TypeScript里我们可以在参数名旁使用 ?实现可选参数的功能。 age 可传可不传
// 可选参数必须跟在必须参数后面
// firstName 初始化默认值 带默认初始化的参数都是可选 可以不赋值
function buildName(firstName = "Will", lastName: string, age?:number) {
return firstName + " " + lastName;
}
// let result1 = buildName("Bob"); // 未提供 "lastName" 的自变量。
let result2 = buildName("Bob", "Adams", 15);
let result3 = buildName("Bob", "Adams");
// 默认值的参数不需要放在必须参数的后面。 如果带默认值的参数出现在必须参数前面,用户必须明确的传入 undefined值来获得默认值
let result4 = buildName(undefined, "Adams"); //Will Adams
剩余参数
剩余参数会被当做个数不限的可选参数。 可以一个都没有,同样也可以有任意个。 编译器创建参数数组,名字是你在省略号( ...)后面给定的名字,你可以在函数体内使用这个数组。
function buildName(firstName: string, ...restOfName: string[]) {
return firstName + " " + restOfName.join(" ");
}
let employeeName = buildName("Joseph", "Samuel", "Lucas", "MacKinzie");
console.log(employeeName); //Joseph Samuel Lucas MacKinzie
function buildName(firstName: string, ...restOfName: string[]) {
return firstName + " " + restOfName.join(" ");
}
let buildNameFun: (fname: string, ...rest: string[]) => string = buildName;
this参数
JavaScript里,this的值在函数被调用的时候才会指定。但是要知道函数调用的上下文是什么。
箭头函数能保存函数创建时的 this值,而不是调用时的值。
提供一个显式的 this参数。 this参数是个假的参数,它出现在参数列表的最前面:
function f(this: void) {
// make sure `this` is unusable in this standalone function
}
让我们往例子里添加一些接口,Card 和 Deck,让类型重用能够变得清晰简单些:
interface Card {
suit: string;
card: number;
}
interface Deck {
suits: string[];
cards: number[];
createCardPicker(this: Deck): () => Card;
}
let deck: Deck = {
suits: ["hearts", "spades", "clubs", "diamonds"],
cards: Array(52),
// NOTE: The function now explicitly specifies that its callee must be of type Deck
createCardPicker: function(this: Deck) {
return () => {
let pickedCard = Math.floor(Math.random() * 52);
let pickedSuit = Math.floor(pickedCard / 13);
return {suit: this.suits[pickedSuit], card: pickedCard % 13};
}
}
}
let cardPicker = deck.createCardPicker();
let pickedCard = cardPicker();
console.log("card: " + pickedCard.card + " of " + pickedCard.suit);