typeScript笔记

typeScript 是一种给 JavaScript 添加特性的语言扩展。如:类型批注和编译时类型检查、类、接口、模块。

数据类型系统: numbers, strings, structures, boolean等,当类型没有给出时,TypeScript 编译器利用类型推断以推断类型。如果由于缺乏声明,没有类型可以被推断出,那么它就会默认为是动态的 any 类型。any’类型是一种强大的兼容存在的 JavaScript 库的类型系统。他允许跳过 TypeScript 的编译时类型的检查。(这些值可能来自动态内容,例如从用户或第三方库。在这种情况下,我们要退出类型检查)

any:

var notSure: any = 4;//notSure 这个是不确定的值,默认先给一个数字 4

notSure = "this string";//改变这个值为 this string

notSure = false; //最终确定的值是一个 boolean 值.

数组 Array:
//第一种方式,你可以在数据类型之后带上’[]‘:
var list:number[] = [1, 2, 3];
//第二种方式,也可以采用泛型的数组类型:
var list1:Array<number> = [1, 2, 3];//泛型数组

var isFlag:boolean=false;这个 : 号代表应该是代表继承的意思

枚举 Enum
enum Color {Red, Green, Blue};//enum 关键字 枚举对象{声明变量}
var c1: Color = Color.Green;//从枚举里面拿出绿色出来赋给一个叫 c 的变量
//---------手动枚举所有值都设置---------------------
//默认枚举类型其实数值从 0 开始,你可以可用手动设置某一个成员的数值。例如我们可以将上文
的起始值定为 1:
enum Color1 {Red = 1, Green = 2, Blue = 4};
var c2: Color1 = Color1.Green;
//---------手动设置全部的枚举成员:---------------------
enum Color2 {Red = 1, Green, Blue};
var colorName: string = Color2[2];

var Color1;
(function (Color1) {
  Color1[Color1["Red"] = 1] = "Red";
  Color1[Color1["Green"] = 2] = "Green";
  Color1[Color1["Blue"] = 4] = "Blue";
})(Color1 || (Color1 = {}));

void 和‘any’相对的数据类型则是’Void‘,它代表没有任何数据类型。我们常用的一个方法
没有任何返回值:
//,格式如:function doMain:void{}
function warnUser(): void {
alert("This is my void");
}

例子:ts & js

/***返回 string 一个值***/
function setTableRowHtml2():string{
  var userName:string="";
  $("tr").each(function(){
    userName=$(this).find("td:eq(1)").html();
  );
  return userName;
}

Ts 编译生成的 js

/***返回 string 一个值***/
function setTableRowHtml2() {
  var userName = "";
  $("tr").each(function () {
    userName = $(this).find("td:eq(1)").html();
  });
  return userName;
}

TypeScript 接口

/**--声明一个接口,这个接口不会在 js 上面出现,只会在显示一个 user 对象在 getUserInfo*/

interface IUserInfo{
     age : any;//定义一个任何变量的 age.
  userName :string;//定义一个 username.
}
/*********获取用户信息*******/
function getUserInfo(user : IUserInfo):string{
  return user.age+"======"+user.userName;
}
//用一个数组对象作为一个 user 对象传值过 getUserInfo 函数方法..参数必须要以接口
IUserInfo 对应上.
少传一个参数,typescript 会自动帮你检测报错,如果用纯 javascript 去写的话,不会报错,
ts 大大减少检查 js 问题

interface SquareConfig {
  color?: string;//
  width?: number;
}
/***************创建一个对象 function.**************/
function createSquare(config: SquareConfig): {color: string; area: number} {
//此时 newSquare 里面的参数必须与 :后面里面的参数名称一致.
  var newSquare = {color: "white", area: 100};
  if (config.color) {
    newSquare.color = config.color;
  }
  if (config.width) {
    newSquare.area = newSquare.area * config.width;
  }
  return newSquare;
}
//--createSquare 返回的对象是 newSquare,所有只能获取 color 和 area 并获取不了 width
这个属性的值..
var mySquare1 = createSquare({color: "red"});//与接口的变量 color 一样,此时这个值
是取出是默认值 color=red
var mySquare2 = createSquare({color1: "red"});//与接口的变量 color 不一样,此时这
个值是取出是默认值 color=white
console.log(mySquare1.color+"=="+mySquare1.area);//
console.log(mySquare2.color+"=="+mySquare2.area);//
var mySquare3 = createSquare({color: "yellow",80});//这里给了两个变量值,
一个是 color,一个是 width
console.log(mySquare3.color+"=="+mySquare3.area);//所以这个值必须等于 800JavaScript 的 的 search 函数//--typescript 的 function 类型结合 javascript 的 search 函数使interface searchFunt{

//声明一个两个变量..
  (source: string, subString: string): boolean;
}
var mySearch : searchFunt;//声明一个 interface 变量接收
mySearch = function(source:string,subString:string){
  var result = source.search(subString);
  if (result == -1) {
    return false;
  }
  else {
   return true;
  }
}
$(function(){
  var source:string ="this is ok";
  var subString1:string ="ok";
  var subString2:string ="not";
  var result:boolean;
  var result1= mySearch(source,subString1);//从 source 字符串上面找 ok,返回值
是 true
var result2= mySearch(source,subString2);//从 source 字符串上面找 not,返回
值是 false
alert(result1);//
alert(result2);
});

接口定义 Array
interface StringArray {
  [index: number]: string;
  //length: number;
}
var myArray:StringArray;
myArray = ["Bob", "Fred"];
$(function(){
  $.each(myArray,function(key,val){
  alert(val);
  });
})

class 实现 implements 接口

interface IClock {
  currentTime: Date;
  setTime(d: Date);
}
//--实现 IClock 接口
class Clock implements IClock{
  currentTime:Date;
  constructor(h: number, m: number) { }//--构造函数方法
  setTime(d:Date){
    this.currentTime=d;
  }
}
//--------------------------------------------------
interface IClock1 {
  new (hour: number, minute: number);
}
class Clock1 {
  currentTime: Date;
  constructor(h: number, m: number) { }
}
var cs: IClock1 = Clock1;
var newClock = new cs(7, 30);
console.log(newClock);

扩展接口 Extending Interfaces
interface IShape{
  color:string;
}
interface PenStroke {
  penWidth: number;
}
//--接口继承接口,用,分割开多继承.
interface ISquare extends IShape,PenStroke {
  sideLength: number;
}
//---赋值..
var square = <ISquare>{};
square.color="red";
square.sideLength=100;
square.penWidth=50;

混合型 Hybrid Types

interface Counter {
  (start: number): string;//声明一个开始变量
  interval:number;//声明一个间隔变量
  reset(): void;//声明一个重置 function 方法
}
var c: Counter;
c(10);//开始.
c.interval=5.0;
c.reset();//重置.

TypeScript 类
//--这个是简单的 class
class Employee {
  fullName: string;
}
var employee = new Employee();
employee.fullName = "Long long";//赋值
//说明这个属性是存在的..
if (employee.fullName) {
  alert(employee.fullName);
}
Ts 文件编译成 js 文件代码
/// <reference path="../plugins/typescript/typings/jquery.d.ts" />
//--这个是简单的 class
var Employee = (function () {
  function Employee() {
  }
  return Employee;
})();
var employee = new Employee();
employee.fullName = "Long long"; //赋值
//说明这个属性是存在的..
if (employee.fullName) {
  alert(employee.fullName);
}

class使用 constructor super 关键字

一、-------------------

class Person{
  userName:string;//声明一个名称
  //构造方法
  onstructor(paramVal:string){
    this.userName=paramVal;
  }
  //--声明一个 getPersonInfo 方法,并在声明 age 变量
  getPersonInfo(age:number=120):string{
    return this.userName+" "+age;
  }
}
class Student1 extends Person{
  constructor(username:string){
    super(username);
  }
  getPersonInfo(age=100){
    var superMsg=super.getPersonInfo(age);
    return this.userName+" "+age+"岁"+" "+"默认信息:" +superMsg;
  }
}
class Student2 extends Person{
  constructor(username:string){
    super(username);
  }
  getPersonInfo(age=120){
    var superMsg=super.getPersonInfo(age);
    return this.userName+" "+age+"岁"+" "+"默认信息:" +superMsg;
  }
}
var stu1=new Student1("周伯通");
var stu2=new Student2("老毒物");
var stuMsg1=stu1.getPersonInfo();
var stuMsg2=stu2.getPersonInfo(80);//传一个默认值给 getPersonInfo 方法

二、-------------------默认是 public-------

class MyAnimal {
  private name:string;
  //构造方法
  constructor(private theName : string){
    this.name = theName;
  }
  getMsg(name : string):string{
    return this.name=name;
  }
}
//犀牛
class Rhino extends MyAnimal{
  constructor(){
    super("犀牛");
  }
  getMsg(name : string):string{
    return name;
  }
}
//员工
class Employees {
  private name:string;
  //构造方法
  constructor(theName : string) {
    this.name = theName;
  }
}
var animal = new MyAnimal("山羊");//Goat 山羊
var retMsg1=animal.getMsg("鹿");
var rhino = new Rhino();
var employees = new Employees("洪七公");
animal = rhino;
//animal = employees;//此时这个值不能赋给 animal,并不能编译通过.

三、----------- class高级技巧------

//当您声明一个类,你实际上是在同一时间创建多个声明。第一个是类的实例的类型

class Greeter {
  static standardGreeting = "Hello, there";
  greeting: string;
  greet() {
    if (this.greeting) {
      return "Hello, " + this.greeting;
    }
    else {
      return Greeter.standardGreeting;
    }
  }
}
var greeter1: Greeter;
greeter1 = new Greeter();
alert(greeter1.greet());
var greeterMaker: typeof Greeter = Greeter;
greeterMaker.standardGreeting = "Hey there!";
var greeter2:Greeter = new greeterMaker();
alert(greeter2.greet());

TypeScript 块
分多个 ts 文件实现 module (不分文件实现 module ,将其整合在一起)
Validation.ts 代码

module Validation{
  export interface StringValidator {
    isAcceptable(s: string): boolean;//是否接受.
  }
}
ZipCodeValidator.ts 代码

module Validation {
  //匹配 0-9 的数字.
  var numberRegexp = /^[0-9]+$/;
  export class ZipCodeValidator implements StringValidator {
    isAcceptable(s: string) {
    //如果长度=5 并且是数字就返回一个 true
    return s.length === 5 && numberRegexp.test(s);
    }
  }
}
LettersOnlyValidator.ts 代码

module Validation {
  //匹配 A-Z,a-z 的英文
  var lettersRegexp = /^[A-Za-z]+$/;
  export class LettersOnlyValidator implements StringValidator {
    isAcceptable(s: string) {
      return lettersRegexp.test(s);
    }
  }

test-1.ts 代码
// 声明一个数组.
var strings = ['Hello', '98052', '101'];
// 使用这个验证.
var validators: { [s: string]: Validation.StringValidator; } = {};
validators['Zip Code'] = new Validation.ZipCodeValidator();//这个是验证邮政
编码
validators['Letters only'] = new Validation.LettersOnlyValidator();//这个是
验证英文
function showMsg():void{
  //显示每个字符串是否通过每个验证
  strings.forEach(s => {
    for (var name in validators) {
      console.log('"' + s + '" ' + (validators[name].isAcceptable(s) ? '
      matches ' : ' does not match ') + name);
      $("#msg1").html('"' + s + '" ' + (validators[name].isAcceptable(s) ?
      ' matches ' : ' does not match ') + name);
    }//--for--end
  });//--forEach--end
}
$(document).ready(function(){
showMsg();
});

import , require 关键字

某father.ts文件,子son.ts文件 import  father = require('./father');  father.方法   (接口 &实现 结合 :export = 对象)

不使用 Module,如果我们在 typescript 使用了 module 函数,则生成的代码在
浏览器端执行时,需要有一些 script loader 的支持。对于浏览器端代码,我们一般生成 amd 风格的代码,所以需要找一个支持 amd 的库放在前端,我这里首选的是 AMD 这样的库有很多,比如1. RequireJS 2. Nodules 3. JSLocalnet 4. curl.js

不然的话运行这个 html 会报 ReferenceError: define is not defined

 module 别名的使用

//--声明一个--Shapes 块别名--
module Shapes {
//===========================多边形===========================
  export module Polygons {
//===========================三角形===========================
    export class Triangle {
      side : number = 3;//声明边一个变量,并且给一个默认值..
      theName : string;//声明一个名字
      //声明构造方法--传一个名字的参数..
      constructor(strName : string) {
        this.theName = strName;
      }
      //计算三角形,获取面积,这里为了返回一个构造方法的传进来的字符串,故返回类
      型给了一个 any 类型..
      getTriangleArea(side : number) : any{
        return this.theName+ this.side*side;
      }
    }
//===========================正方形===========================
    export class Square {
      side : number = 8;//声明边一个变量,并且给一个默认值..
      theName : string;//声明一个名字
      //声明构造方法--传一个名字的参数..
      constructor(strName : string) {
        this.theName = strName;
      }
      //---计算正方形,获取面积
      getSquareArea(side : number) : any{
        return this.theName+ this.side*side;
      }
    }
  }
}

原文地址:https://www.cnblogs.com/darrenhwang/p/7089311.html