TypeScript为JavaScript函数添加了额外的功能,让咱们能够更容易地使用。TypeScript中的函数也包括JavaScript中最多见的两种函数dom
function add(x,y){ return x + y; } let add = function(x,y){ return x + y; }
能够像变量同样为函数定义类型函数
function add(x: number, y: number): number { return x + y; } let myAdd = function(x: number, y: number): number { return x+y; };
函数的完整类型ui
let add: (x: number,y: number) => number = function(x: number,y: number): number { return x + y};
完整的函数类型太过麻烦,推荐仍是写简单的,并且若是函数没有返回值,最好设置为void,不要留空this
注意:在TypeScript中传递给一个函数的参数个数必须与函数指望的参数个数一致。spa
function buildName(firstName: string, lastName: string) { return firstName + " " + lastName; } let result1 = buildName("Bob"); // error let result2 = buildName("Bob", "Adams", "Sr."); // error let result3 = buildName("Bob", "Adams");
可选参数应该能够猜到,没错,就是使用?rest
function buildName(firstName: string, lastName?: string) { if (lastName) return firstName + " " + lastName; else return firstName; } let result1 = buildName("Bob"); // works correctly now let result2 = buildName("Bob", "Adams", "Sr."); // error, too many parameters let result3 = buildName("Bob", "Adams"); // ah, just right
默认参数都是老套路code
function buildName(firstName: string, lastName = "Smith") { return firstName + " " + lastName; } let result1 = buildName("Bob"); let result2 = buildName("Bob", undefined); let result3 = buildName("Bob", "Adams", "Sr."); // error, too many parameters let result4 = buildName("Bob", "Adams");
有时,你想同时操做多个参数,或者你并不知道会有多少参数传递进来。 在JavaScript里,你能够使用arguments来访问全部传入的参数。blog
在TypeScript里,你能够把全部参数收集到一个变量里:ip
function buildName(firstName: string, ...restOfName: string[]) { return firstName + " " + restOfName.join(" "); } let employeeName = buildName("Joseph", "Samuel", "Lucas", "MacKinzie");
你也能够操做这个变量string
function buildName(firstName: string, ...restOfName: string[]) { return firstName + " " + restOfName.join(" "); } let buildNameFun: (fname: string, ...rest: string[]) => string = buildName;
this是JavaScript中的难点之一,看看下面的代码
let deck = { suits: ["hearts", "spades", "clubs", "diamonds"], cards: Array(52), createCardPicker: function() { return function() { 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(); alert("card: " + pickedCard.card + " of " + pickedCard.suit);
你的答案是什么?
答案是报错!这时由于deck.createCardPicker()返回一个函数赋值给cardPicker,而cardPicker是以函数式的方式调用的,因此this指向window。之因此这样是由于在JavaScript中this是在被调用时肯定的,而在TypeScript中能够将this设置为在函数定义时就肯定,方法就是把函数表达式变为使用lambda表达式( () => {} )
let deck = { suits: ["hearts", "spades", "clubs", "diamonds"], cards: Array(52), createCardPicker: function() { // NOTE: the line below is now an arrow function, allowing us to capture 'this' right here 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(); alert("card: " + pickedCard.card + " of " + pickedCard.suit);
这样就没有问题了
参考资料:
TypeScript Handbook(中文版)