开始学习TypeScript

Posted 前端手艺人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开始学习TypeScript相关的知识,希望对你有一定的参考价值。

当前浏览器不支持播放音乐或语音,请在微信或其他浏览器中播放

什么是TypeScript?

它是微软开发的自由和开源的编程语言,是javascript的超集,扩展了JavaScript的语法。主要的用处就是代码类型检查。

安装

 
   
   
 
  1. npm install -g typescript

编译

 
   
   
 
  1. tsc filename.js

在线编译:https://www.typescriptlang.org/play/

语言特性

1 类型批注:编译时进行类型检查

 
   
   
 
  1. function area(shape: string, width: number, height: number) {

  2.    var area = width * height;

  3.    return "I'm a " + shape + " with an area of " + area + " cm squared.";

  4. }

  5. document.body.innerhtml = area("rectangle", 30, 15);

2 接口:通过接口扩展。

 
   
   
 
  1. interface Shape {

  2.    name: string,

  3.    width: number,

  4.    height: number,

  5.    color?: string

  6. }

  7. function area(shape: Shape) {

  8.    var area = shape.width * shape.height;

  9.    return "I'm " + shape.name + " with area " + area + " cm squared";

  10. }

  11. console.log(area({ name: "rectangle", width: 30, height: 15 }));

  12. console.log(area({ name: "square", width: 30, height: 30, color: "blue" }));

3 箭头函数 :自动将函数的this附加到上下文中

 
   
   
 
  1. var shape = {

  2.    name: "rectangle",

  3.    popup: function() {

  4.        console.log("This inside popup(): " + this.name);

  5.        setTimeout(function() {

  6.            console.log("This inside setTimeout(): " + this.name);

  7.            console.log("I'm a " + this.name + "!");

  8.        }, 3000);

  9.    }

  10. };

  11. shape.popup();

输出: 

This inside popup(): rectangle

This inside setTimeout(): 

I'm a ! 

采用箭头函数后:

 
   
   
 
  1. var shape = {

  2.    name: "rectangle",

  3.    popup: function() {

  4.        console.log("This inside popup(): " + this.name);

  5.        setTimeout(() => {

  6.            console.log("This inside setTimeout(): " + this.name);

  7.            console.log("I'm a " + this.name + "!");

  8.        }, 3000);

  9.    }

  10. };

  11. shape.popup();

输出: 

This inside popup(): rectangle 

This inside setTimeout(): rectangle 

I'm a rectangle! 

3 类

 
   
   
 
  1. class Shape {

  2.    public area: number;

  3.    private color: string;

  4.    constructor(name: string, width: number, height: number) {

  5.        this.area = width * height;

  6.        this.color = "pink";

  7.    };

  8.    shoutout() {

  9.        return "I'm " + this.color + " " + this.name + " with an area of " + this.area + " cm squared.";

  10.    }

  11. }

  12. var square = new Shape("square", 30, 30);

  13. console.log(square.shoutout());

private和public是修饰符 

4 继承

 
   
   
 
  1. class Shape3D extends Shape {

  2.    volume: number; //color属性因为是私有不会被继承 area会被继承

  3.    constructor(public name: string, width: number, height: number, length: number) {

  4.        super(name, width, height);

  5.        this.volume = length * this.area;

  6.    };

  7.    shoutout() {

  8.        return "I'm " + this.name + " with a volume of " + this.volume + " cm cube.";

  9.    }

  10.    superShout() {

  11.        return super.shoutout(); //调用父类也就是Shape的方法

  12.    }

  13. }

  14. var cube = new Shape3D("cube", 30, 30, 30);

  15. console.log(cube.shoutout());

  16. console.log(cube.superShout());

接口和类的对比

接口是在编译时类型检查时候用到,不会有JS代码,而类的话会自动编译成js代码:

 
   
   
 
  1. class Test {

  2.    a: number;

  3.    b: string;

  4. }

  5. class Test2 extends Test {

  6.    c: number;

  7. }

编译后:(在线编译试一试:https://www.typescriptlang.org/play/)

 
   
   
 
  1. var __extends = (this && this.__extends) || (function() {

  2.    var extendStatics = Object.setPrototypeOf || ({

  3.        __proto__: []

  4.    }

  5.    instanceof Array &&

  6.    function(d, b) {

  7.        d.__proto__ = b;

  8.    }) ||

  9.    function(d, b) {

  10.        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];

  11.    };

  12.    return function(d, b) {

  13.        extendStatics(d, b);

  14.        function __() {

  15.            this.constructor = d;

  16.        }

  17.        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());

  18.    };

  19. })();

  20. var Test =

  21. /** @class */

  22. (function() {

  23.    function Test() {}

  24.    return Test;

  25. } ());

  26. var Test2 =

  27. /** @class */

  28. (function(_super) {

  29.    __extends(Test2, _super);

  30.    function Test2() {

  31.        return _super !== null && _super.apply(this, arguments) || this;

  32.    }

  33.    return Test2;

  34. } (Test));

所以如果做接口声明,最好采用接口。

TypeScript和Flow的区别

Flow是Facebook推出的一款类型检查工具。TypeScript 实现了类型检查,同时实现了转译工具用来生成纯粹的 JavaScript Flow 只进行类型检查,并依赖 Babel、flow-remove-types或者其它工具来移除类型说明。

比如下面是Flow类型检查代码:

 
   
   
 
  1. // @flow

  2. function bar(x): string {

  3.   return x.length;

  4. }

  5. bar('Hello, world!');

在浏览器控制台,它不会工作!你会得到一个错误消息,比如 Unexpected token :,因为解析器遇到了返回类型申明。如果想让这段代码正确运行,就必须移除类型说明。 

以上就是今天的内容,谢谢阅读。

参考文章:

http://www.runoob.com/w3cnote/getting-started-with-typescript.html

https://medium.com/front-end-hacking/typescript-class-vs-interface-99c0ae1c2136

http://www.zcfy.cc/article/typescript-vs-flow-marius-schulz-2359.html

以上是关于开始学习TypeScript的主要内容,如果未能解决你的问题,请参考以下文章

typescript Angular最终版本的Angular 2测试片段。代码库https://developers.livechatinc.com/blog/category/programming

typescript Angular最终版本的Angular 2测试片段。代码库https://developers.livechatinc.com/blog/category/programming

typescript Angular最终版本的Angular 2测试片段。代码库https://developers.livechatinc.com/blog/category/programming

TypeScript学习笔记之基础类型

PHP必用代码片段

typescript 简版跳一跳