typescripts学习

可选与默认参数



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

  1. function buildName(firstName: string, lastName?: string) { //lastName为可选参数
  2. if (lastName)
  3. return firstName + " " + lastName;
  4. else
  5. return firstName;
  6. }
  7. var result1 = buildName("Bob"); //正确调用 Bob
  8. var result2 = buildName("Bob", "Adams"); //正确调用 Bob Adams

默认参数:在参数名后直接给定一个值,如果这个值没有被传入,那么将会被赋值为默认值。如下代码:

  1. function buildName(firstName: string, lastName = "Smith") {
  2. return firstName + " " + lastName;
  3. }
  4. var result1 = buildName("Bob"); //没有传入第二个参数,则被赋值为默认的smith,结果为:Bob Smith
  5. var result2 = buildName("Bob", "Adams"); //结果为:Bob Adams

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

继承



  TypeScript中用关键字extends指明继承关系。例如,已经定义了类A,如果让类B继承A,我们把A叫做基类,B叫子类。可以用下面的方式定义类B。

  1. class B extends A {
  2. // 类B中的成员
  3. }

  如果我们要在子类中调用基类中的属性与方法就要使用super关键字。如下代码:

  1. class Animal { //定义基类
  2. name:string;
  3. constructor(theName: string) { this.name = theName; }
  4. move(meters: number) {
  5. document.write(this.name + " moved " + meters + "m.");
  6. }
  7. }
  8. class Snake extends Animal { //继承基类
  9. constructor(name: string) {
  10. super(name); //调用基本类的构造函数
  11. }
  12. move() { //重写了基类的方法
  13. document.write("Slithering...<br>");
  14. super.move(5); //调用基类的方法
  15. }
  16. }
  17. var sam = new Snake("Python"); //声明Snake类
  18. sam.move();

接口声明



  在TypeScript中,接口是用作约束作用的,在编译成JavaScript的时候,所有的接口都会被擦除掉,因为 JavaScript中并没有接口这一概念。TypeScript中接口是用关键字interface进行声明,例如:

  1. interface LabelledValue { //定义接口
  2. label: string; //定义属性
  3. }
  1. interface LabelledValue { //定义接口
  2. label: string;
  3. }
  4. function printLabel(labelledObj: LabelledValue) { //定义函数printLabel,其参数类型为接口类型
  5. document.write(labelledObj.label);
  6. }
  7. var myObj = {size: 10, label: "Size 10 Object"}; //定义含有接口中属性的对象
  8. printLabel(myObj); //调用函数

可选属性



  有时不是所有定义在interface中的属性都是必须的,typescript中便为我们提供了可选属性。带有可选属性的interface定义和c#语言很相似,以?紧跟变量名后边表示。如下代码:

  1. interface SquareConfig { //定义了两个可选属性
  2. color?: string;
  3. width?: number;
  4. }
  5. function createSquare(config: SquareConfig): {color: string; area: number} {//定义函数
  6. var newSquare = {color: "white", area: 100};
  7. if (config.color) {
  8. newSquare.color = config.color;
  9. }
  10. if (config.width) {
  11. newSquare.area = config.width * config.width;
  12. }
  13. return newSquare;
  14. }
  15. var mySquare = createSquare({color: "black"}); //调用函数,
  16. document.write(mySquare.color); //结果为: black

  大家可能会问既然是可选属性,可有可无的,那么为什么还要定义呢?对比起完全不定义,定义可选属性主要是:如果存在属性,能约束类型,而这也是十分关键的。

方法类型



  在 JavaScript 中,方法 function 是一种基本类型。在面向对象思想中,接口的实现是靠类来完成的,而 function 作为一种类型,是不是能够实现接口呢?答案是肯定的。在 TypeScript 中,我们可以使用接口来约束方法的签名。

  1. interface SearchFunc {
  2. (source: string, subString: string): boolean; //定义一个匿名方法
  3. }
  4. var mySearch: SearchFunc;
  5. mySearch = function(source: string, subString: string) { //实现接口
  6. var result = source.search(subString); //调用系统方法search查找字符串的位置
  7. if (result == -1) {
  8. return false;
  9. }
  10. else {
  11. return true;
  12. }
  13. }

  上面代码中,我们定义了一个接口,接口内约束了一个方法的签名,这个方法有两个字符串参数,返回布尔值。在第二段代码中我们声明了这个接口的实现。编译器仅仅检查类型是否正确(参数类型、返回值类型),因此参数的名字我们可以换成别的。

数组类型



  在前面一节中我们学习了接口定义方法类型,这一节我们来学习接口定义数组类型。在数组类型中有一个“index”类型其描述数组下标的类型,以及返回值类型描述每项的类型。如下:

  1. interface StringArray { //定义数组接口
  2. [index: number]: string; //每个数组元素的类型
  3. }
  4. var myArray: StringArray;
  5. myArray = ["Bob", "Fred"];

  在接口的定义里面,索引器的名字一般为 index(当然也可以改成别的,但一般情况下都是保持名字为 index)。索引器的类型只能为 number 或者 string。

  1. interface Array{
  2. [myindex: number]: number;
  3. }
  4. interface Dictionary{
  5. [index: string]: any;
  6. }

Class类型



  在C#和java中interface是很常使用的类型系统,其用来强制其实现类符合其契约。在TypeScript中同样也可以实现,通过类实现接口要用implements关键字。如下代码:

  1. interface IPrint{
  2. print();
  3. }
  4. class A implements IPrint { //实现接口
  5. print(){ //实现接口中的方法
  6. document.write("实现接口");
  7. }
  8. }
  9. var B=new A();
  10. B.print();

接口继承



  和类一样,接口也能继承其他的接口。这相当于复制接口的所有成员。接口也是用关键字“extends”来继承。

  1. interface Shape { //定义接口Shape
  2. color: string;
  3. }
  4. interface Square extends Shape { //继承接口Shape
  5. sideLength: number;
  6. }

一个interface可以同时继承多个interface,实现多个接口成员的合并。用逗号隔开要继承的接口。

  1. interface Shape {
  2. color: string;
  3. }
  4. interface PenStroke {
  5. penWidth: number;
  6. }
  7. interface Square extends Shape, PenStroke {
  8. sideLength: number;
  9. }

模块的声明



  前端数据验证在改善用户体验上有很大作用,在学了前面的知识,我们很可能会写出以下代码:

  1. interface StringValidator { //定义验证接口
  2. isAcceptable(s: string): boolean;
  3. }
  4. var lettersRegexp = /^[A-Za-z]+$/;
  5. var numberRegexp = /^[0-9]+$/;
  6. class LettersOnlyValidator implements StringValidator { //实现接口
  7. isAcceptable(s: string) {
  8. return lettersRegexp.test(s);
  9. }
  10. }
  11. class ZipCodeValidator implements StringValidator { //实现接口
  12. isAcceptable(s: string) {
  13. return s.length === 5 && numberRegexp.test(s);
  14. }
  15. }
  16. var strings = [‘Hello‘, ‘98052‘, ‘101‘];
  17. var validators: { [s: string]: StringValidator; } = {};
  18. validators[‘ZIP code‘] = new ZipCodeValidator(); //实例化类
  19. validators[‘Letters only‘] = new LettersOnlyValidator(); //实例化类
  20. for(var i=0;i<strings.length;i++){
  21. for (var name in validators) {
  22. document.write(‘"‘ + strings[i] + ‘" ‘ + (validators[name].isAcceptable(strings[i]) ? ‘ matches ‘ : ‘ does not match ‘) + name+"<br>"); //调用类的方法
  23. }
  24. }

  那么这段代码最大的问题是什么呢?一个是没法复用,验证的封装和验证过程在同一个文件,验证的封装已经是可以复用的。另一个是接口和两个实现的类都直接挂接在全局变量上,假如数量一多的话,将会影响整个全局变量。

  而TypeScritp中模块的出现给我们解决了这一问题。使用 module 关键字来定义模块,并在末尾加花括号即可用; 用export 关键字使接口、类等成员对模块外可见。

  1. module Validation { //定义模块
  2. export interface StringValidator { //声明接口对外部可以使用
  3. isAcceptable(s: string): boolean;
  4. }
  5. var lettersRegexp = /^[A-Za-z]+$/;
  6. var numberRegexp = /^[0-9]+$/;
  7. export class LettersOnlyValidator implements StringValidator { //声明类对外部可用
  8. isAcceptable(s: string) {
  9. return lettersRegexp.test(s);
  10. }
  11. }
  12. export class ZipCodeValidator implements StringValidator {
  13. isAcceptable(s: string) {
  14. return s.length === 5 && numberRegexp.test(s);
  15. }
  16. }
  17. }

模块内容的调用



  在前面一节中我学习了模块的声明,而在模块声明完成以后,我们就可以调用这个模块了,调用模块中的接口、类、方法等。调用方法简单,就是用模块名后面跟一个点来调用类、接口、方法等。如下代码:

  1. module Validation { //定义模块
  2. export interface StringValidator { //声明接口对外部可以使用
  3. isAcceptable(s: string): boolean;
  4. }
  5. var lettersRegexp = /^[A-Za-z]+$/;
  6. var numberRegexp = /^[0-9]+$/;
  7. export class LettersOnlyValidator implements StringValidator { //声明类对外部可用
  8. isAcceptable(s: string) {
  9. return lettersRegexp.test(s);
  10. }
  11. }
  12. export class ZipCodeValidator implements StringValidator {
  13. isAcceptable(s: string) {
  14. return s.length === 5 && numberRegexp.test(s);
  15. }
  16. }
  17. }
  18. var strings = [‘Hello‘, ‘98052‘, ‘101‘];
  19. var validators: { [s: string]: Validation.StringValidator; } = {};
  20. validators[‘ZIP code‘] = new Validation.ZipCodeValidator(); //使用模块中的类
  21. validators[‘Letters only‘] = new Validation.LettersOnlyValidator();
  22. // 显示匹配结果
  23. for(var i=0;i<strings.length;i++){
  24. for (var name in validators) {
  25. document.write(‘"‘ + strings[i] + ‘" ‘ + (validators[name].isAcceptable(strings[i]) ? ‘ matches ‘ : ‘ does not match ‘) + name+"<br>"); // 使用方法
  26. }
  27. }

分隔模块到多个文件



  随着我们项目的扩展,我们的代码总不可能只写在一个文件里。为了更好地维护项目,我们会将特定功能放到一个文件里,然后加载多个文件实现我们想需要的功能。现在我们先将上面的代码分割到多个文件里。

Validation.ts

  1. module Validation {
  2. export interface StringValidator {
  3. isAcceptable(s: string): boolean;
  4. }
  5. }

LettersOnlyValidator.ts

  1. /// <reference path="Validation.ts" />
  2. module Validation {
  3. var lettersRegexp = /^[A-Za-z]+$/;
  4. export class LettersOnlyValidator implements StringValidator {
  5. isAcceptable(s: string) {
  6. return lettersRegexp.test(s);
  7. }
  8. }
  9. }

ZipCodeValidator.ts

  1. /// <reference path="Validation.ts" />
  2. module Validation {
  3. var numberRegexp = /^[0-9]+$/;
  4. export class ZipCodeValidator implements StringValidator {
  5. isAcceptable(s: string) {
  6. return s.length === 5 && numberRegexp.test(s);
  7. }
  8. }
  9. }

Test.ts

  1. /// <reference path="Validation.ts" />
  2. /// <reference path="LettersOnlyValidator.ts" />
  3. /// <reference path="ZipCodeValidator.ts" />
  4. var strings = [‘Hello‘, ‘98052‘, ‘101‘];
  5. var validators: { [s: string]: Validation.StringValidator; } = {};
  6. validators[‘ZIP code‘] = new Validation.ZipCodeValidator();
  7. validators[‘Letters only‘] = new Validation.LettersOnlyValidator();
  8. for(var i=0;i<strings.length;i++){
  9. for (var name in validators) {
  10. document.write(‘"‘ + strings[i] + ‘" ‘ + (validators[name].isAcceptable(strings[i]) ? ‘ matches ‘ : ‘ does not match ‘) + name+"<br>"); //调用类的方法
  11. }
  12. }

  在项目中新建好以上四个文件,然后我们编译项目,如果我们代码编写没错的话,是能够编译通过的。另外,我们可以见到后面三个文件开头有类似于 C# 的文档注释,这是告诉 TypeScript 编译器该文件依赖于哪些文件,假如依赖的文件不存在的话,编译就会不通过。当然我们不写也是可以的,只不过编译器在编译时不会帮我们检查,一般来说,还是建议写上。 另外,在引用编译生成的 JavaScript 文件时,我们需要注意好顺序。以上面的代码为例,我们在 Html 代码中已经这么引用。

  1. <script src="Validation.js" type="text/javascript"/>
  2. <script src="LettersOnlyValidator.js" type="text/javascript"/>
  3. <script src="ZipCodeValidator.js" type="text/javascript"/>
  4. <script src="Test.js" type="text/javascript"/>

原文地址:https://www.cnblogs.com/mttcug/p/8120259.html

时间: 2024-11-04 19:54:49

typescripts学习的相关文章

Vue.js学习笔记:属性绑定 v-bind

v-bind  主要用于属性绑定,Vue官方提供了一个简写方式 :bind,例如: <!-- 完整语法 --> <a v-bind:href="url"></a> <!-- 缩写 --> <a :href="url"></a> 绑定HTML Class 一.对象语法: 我们可以给v-bind:class 一个对象,以动态地切换class.注意:v-bind:class指令可以与普通的class特

Java多线程学习(吐血超详细总结)

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线程状态转换 五线程调度 六常用函数说明 使用方式 为什么要用join方法 七常见线程名词解释 八线程同步 九线程数据传递 本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法.概述等. 首先讲一下进程和线程

微信小程序学习总结(2)------- 之for循环,绑定点击事件

最近公司有小程序的项目,本人有幸参与其中,一个项目做下来感觉受益匪浅,与大家做下分享,欢迎沟通交流互相学习. 先说一下此次项目本人体会较深的几个关键点:微信地图.用户静默授权.用户弹窗授权.微信充值等等. 言归正传,今天分享我遇到的关于wx:for循环绑定数据的一个tips:  1. 想必大家的都知道wx:for,如下就不用我啰嗦了: <view class="myNew" wx:for="{{list}}">{{item.title}}<view

【安全牛学习笔记】

弱点扫描 ╋━━━━━━━━━━━━━━━━━━━━╋ ┃发现弱点                                ┃ ┃发现漏洞                                ┃ ┃  基于端口五福扫描结果版本信息(速度慢)┃ ┃  搜索已公开的漏洞数据库(数量大)      ┃ ┃  使用弱点扫描器实现漏洞管理            ┃ ╋━━━━━━━━━━━━━━━━━━━━╋ [email protected]:~# searchsploit Usage:

winform学习日志(二十三)---------------socket(TCP)发送文件

一:由于在上一个随笔的基础之上拓展的所以直接上代码,客户端: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net.Sockets; using Sys

零基础的人该怎么学习JAVA

对于JAVA有所兴趣但又是零基础的人,该如何学习JAVA呢?对于想要学习开发技术的学子来说找到一个合适自己的培训机构是非常难的事情,在选择的过程中总是 因为这样或那样的问题让你犹豫不决,阻碍你前进的步伐,今天就让小编为您推荐培训机构新起之秀--乐橙谷Java培训机构,助力你成就好未来. 选择java培训就到乐橙谷 北京有什么好的Java培训机构?来乐橙谷北京学Java,零基础走起,乐橙谷Java基础班授课老师经验非常丰富,课程内容安排合理,适合于有一点点Java基础甚至一点都不会Java的同学学

最全解析如何正确学习JavaScript指南,必看!

划重点 鉴于时不时,有同学私信问我:怎么学前端的问题.这里统一回复一下,如下次再遇到问我此问题同学,就直接把本文链接地址发给你了. "前端怎么学"应该因人而异,别人的方法未必适合自己.就说说我的学习方法吧:我把大部分时间放在学习js上了.因为这个js的学习曲线,先平后陡.项目实践和练习啥的,我不说了,主要说下工作之外的时间利用问题.我是怎么学的呢,看书,分析源码.个人这几天统计了一下,前端书籍目前看了50多本吧,大部分都是js的.市面上的书基本,差不多都看过. 第一个问题:看书有啥好处

轻松学习C语言编程的秘诀:总结+灵感

目前在准备一套C语言的学习教程,所以我这里就以C语言编程的学习来讲.注意,讲的是"轻松学习",那种不注重方法,拼命玩命的方式也有其效果,但不是我提倡的.我讲究的是在方式方法对头.适合你.减轻你学习负担和心里压力的前提下,才适当的抓紧时间. 因此,探索一种很好的学习方法就是我所研究的主要内容. 众所周知,学习C语言并非易事,要学好它更是难上加难.这和你期末考试背会几个题目的答案考上满分没多大关系,也就是说你考试满分也说明不了你学好.学精通了C语言.那么怎么才算学精通C语言?闭着眼睛对自己

开始我的Python爬虫学习之路

因为工作需要经常收集一些数据,我就想通过学爬虫来实现自动化完成比较重复的任务. 目前我Python的状况,跟着敲了几个教程,也算是懂点基础,具体比较深入的知识,是打算从做项目中慢慢去了解学习. 我是觉得如果一开始就钻细节的话,是很容易受到打击而放弃的,做点小项目让自己获得点成就感路才更容易更有信心走下去. 反正遇到不懂的就多查多问就对了. 知乎上看了很多关于入门Python爬虫的问答,给自己总结出了大概的学习方向. 基础: HTML&CSS,JOSN,HTTP协议(这些要了解,不太需要精通) R