【TypeScript】TypeScript 学习 5——方法

在 JavaScript 中,有两种方式定义方法。

1、命名的方法

function add(x,y){
    return x+y;
}

2、匿名方法

var myAdd = function(x,y) { return x+y;};

在 TypeScript 中,也兼容上面两种定义方式,但是,既然我们用的是 TypeScript,那么肯定要强于本来的定义方式。

1、类型化方法

function add(x:number, y:number):number{
    return x+y;
}

var myAdd = function(x:number, y:number):number {return x+y;};

为参数和返回值定义好类型,有助于智能感知和程序逻辑。

2、函数类型变量

在上面第一点,myAdd 变量的类型我们没有指定,完整的写法如下:

var myAdd: (x:number, y:number)=>number = function(x:number, y:number):number { return x+y; };

当然类型参数的命名可以不相同的

var myAdd: (baseValue:number, increment:number)=>number = function(x:number, y:number):number {return x+y;};

3、可选参数

function buildName(firstName: string, lastName?: string):string{
    if(lastName){
        return firstName + " " + lastName;
    }
    else{
        return firstName;
    }
}

在参数名后面,冒号前面添加一个问号,则表明该参数是可选的。

4、默认参数

function buildName(firstName: string, lastName = "Smith"):string {
    return firstName + " " + lastName;
}

如果不传入第二个参数,那么将会被赋值为默认值。

注:可选参数和默认参数必须在参数列表的最后。

5、可变参数

function buildName(firstName: string, ...restOfName: string[]) {
    return firstName + " " + restOfName.join(" ");
}

var employeeName = buildName("Joseph", "Samuel", "Lucas", "MacKinzie");

在参数名前面使用三个点表明该参数的个数是可变的,同样,也是必须在参数列表的最后。

6、lambda 和当前对象

在 JavaScript 中,this 关键字指代的是当前 function。那么我们就很有可能在定义方法时用错。参考下面:

var deck = {
    suits: ["hearts", "spades", "clubs", "diamonds"],
    cards: Array(52),
    createCardPicker: function() {
        return function() {
            var pickedCard = Math.floor(Math.random() * 52);
            var pickedSuit = Math.floor(pickedCard / 13);

            return {suit: this.suits[pickedSuit], card: pickedCard % 13};
        }
    }
}

var cardPicker = deck.createCardPicker();
var pickedCard = cardPicker();

alert("card: " + pickedCard.card + " of " + pickedCard.suit);

那么在调用 createCardPicker 方法的时候,我们将不会得到预期的结果,因为 this 指的是当前 function,而不是 deck 对象。

为了解决这一点,TypeScript 引入 lambda 表示法

var deck = {
    suits: ["hearts", "spades", "clubs", "diamonds"],
    cards: Array(52),
    createCardPicker: function() {
        // Notice: the line below is now a lambda, allowing us to capture ‘this‘ earlier
        return () => {
            var pickedCard = Math.floor(Math.random() * 52);
            var pickedSuit = Math.floor(pickedCard / 13);

            return {suit: this.suits[pickedSuit], card: pickedCard % 13};
        }
    }
}

var cardPicker = deck.createCardPicker();
var pickedCard = cardPicker();

alert("card: " + pickedCard.card + " of " + pickedCard.suit);

那么现在 this,就指代 deck 对象了。

7、方法重载

因为 JavaScript 的语法,所以是不存在重载的。只要你在 JavaScript 中定义了一个方法,那么传入多少个参数都是可以的。但是,从我们上面 TypeScript 的例子中,可以看出 TypeScript 是会检查参数个数、类型是否匹配的。因此 TypeScript 中是有必要存在重载。

var suits = ["hearts", "spades", "clubs", "diamonds"];

function pickCard(x: {suit: string; card: number; }[]): number;
function pickCard(x: number): {suit: string; card: number; };
function pickCard(x): any {
    // Check to see if we‘re working with an object/array
    // if so, they gave us the deck and we‘ll pick the card
    if (typeof x == "object") {
        var pickedCard = Math.floor(Math.random() * x.length);
        return pickedCard;
    }
    // Otherwise just let them pick the card
    else if (typeof x == "number") {
        var pickedSuit = Math.floor(x / 13);
        return { suit: suits[pickedSuit], card: x % 13 };
    }
}

var myDeck = [{ suit: "diamonds", card: 2 }, { suit: "spades", card: 10 }, { suit: "hearts", card: 4 }];
var pickedCard1 = myDeck[pickCard(myDeck)];
alert("card: " + pickedCard1.card + " of " + pickedCard1.suit);

var pickedCard2 = pickCard(15);
alert("card: " + pickedCard2.card + " of " + pickedCard2.suit);

上面代码是 TypeScript 官方的例子,其实可以看出,我们方法体都需要写在一个参数类型、返回类型为 any 的方法中。所以看上去其实有点自欺欺人的意思。方法重载在 TypeScript 中的意义主要在于智能提示。

时间: 2024-10-26 00:54:33

【TypeScript】TypeScript 学习 5——方法的相关文章

typescript handbook 学习笔记4

概述 这是我学习typescript的笔记.写这个笔记的原因主要有2个,一个是熟悉相关的写法:另一个是理清其中一些晦涩的东西.供以后开发时参考,相信对其他人也有用. 学习typescript建议直接看中文文档或英文文档.我是看的英文文档. typescript handbook 学习笔记3 类 基本使用 class Greeter { //只读,必须在声明的时候或者constructor里面初始化 readonly greeting: string; //constructor里面的只读 con

typeScript基础学习

关于 TypeScript TypeScript 是 JavaScript 的一个超集,主要提供了类型系统和对 ES6 的支持,它由 Microsoft 开发,代码开源于 GitHub 上. 什么是 TypeScript TypeScript 是 JavaScript 的类型的超集,它可以编译成纯 JavaScript.编译出来的 JavaScript 可以运行在任何浏览器上.TypeScript 编译工具可以运行在任何服务器和任何系统上.TypeScript 是开源的. 安装 TypeScri

专家修炼-学习的方法

学习要尽早开始.终身进行,同时学习也是要讲究方法的.不讲究学习方法的人即使尽早开始也是事倍功半乃至蹉跎终身. i.人脑的学习原理 现代神经科学和认知科学认为,几乎没有任何技能是人一出生就会的.哪怕是对简单物体的识别,把东西抓取过来这些简单的动作,也是婴儿后天学习的结果.人脑的巧妙之处在于提供了一个能够学习各种技能的能力.与计算机不同,人对于技能的掌握是在大脑硬件层次实现的.人的任何一个技能,都是大脑内一系列神经纤维传递的电脉冲信号的组合.解剖表明拥有不同技能的人,其大脑的神经结构非常不同,比如出

RhinoMock学习-Stub方法

// Arrange var stub = MockRepository.GenerateStub<IDemo>(); stub.Stub(x => x.StringArgString(Arg<string>.Is.Equal("input"))).Return("output"); // Act var firstCallResult = stub.StringArgString("input"); var sec

Junit4学习笔记--方法的执行顺序

package com.lt.Demo.TestDemo; import java.util.Arrays; import java.util.Collection; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; im

学习IOS--description方法\NSLog函数

1.description方法是NSObject自带的方法,包括类方法和对象方法 + (NSString *)description; // 默认返回 类名 - (NSString *)description; // 默认返回 <类名:内存地址> 2.默认情况下利用NSLog和%@输出对象的时返回的就是类名和内存地址 3.修改NSLog和%@的默认输出:重写类对象或者实例对象的description方法即可.因为NSLog函数进行打印的时候会自动调用description方法 /*******

C++学习的方法以及四大名著(荐)

C++学习的方法以及四大名著(荐) 转眼间学习和使用C++已经有近10个年头了,开始学习的时候走了不少的弯路,今天有些时间,希望写下这篇文章并且对开始学习C++的朋友有些帮助.当然我首先需要说明的是,这篇文章是根据本人的感受写的,可能不同的人有不同的观点,欢迎讨论. 开始学习C++的时候中国的互联网环境还不是很好,信息也比较闭塞,所以自己开始的时候是由Thinking in C++ 开始的,买了两卷本的英文版,废了好大的一番周折才算看完了,这个过程大约花费了近6个月的时间,当然期间也要花时间完成

学习的方法,献给 刚刚起步的你们

我是学习.net 的,也是处于学习阶段的, 不过 在这一年多的学习中, 也积累了 一定的经验 , 因为 常 常 也有朋友找我帮他们修改代码 ,或是 解决一些问题, 感觉 ,每个人的学习方式 都是不一样的, 并且 ,有的人 虽然 很用心去学,但是 总是很茫目, 不知道怎么去学好它, 以至 以后在一些小问题上都会感觉到很困惑    记得曾经 , 我刚刚开始学习的时候  , 总是会遇到一些问题,而 当这个问题迟迟得不到解决的时候,我的信心几乎会丧失, 那些日子我也很迷茫 , 虽然 感觉 自己 能很简单

[TypeScript] TypeScript对象转JSON字符串范例

[TypeScript] TypeScript对象转JSON字符串范例 Playground http://tinyurl.com/njbrnrv Samples class DataTable { public columns: Array<string> = new Array<string>(); public rows: Array<DataRow> = new Array<DataRow>(); } class DataRow { public c

学习的方法

其实学习的方法最重要的就是可以整理重点也叫大纲,以点带面. 说具体一点其实就是书本的目录.学习的时候先要了解自己要学什么,然后根据书本目录去理解目录内容, 在短时间内通过书本目录完全了解目录所讲的内容,然后再深入的去看这本书,当你再自己总结出一套自己的目录时,那么你就完全掌握了. 然后可以进而总结一下,办任何事其实都是先总结重点和大纲,比如软件,也是要先写方案.概要需求.需求说明书.开发需求.概要设计等等,其实都是在总结重点和大纲. 在这里比的就是谁总结.理解重点准确和理解的深刻和快速了. 学习