JavaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能。
特点:
1).解析型语言( 可以直接执行 )
2).弱类型语言( 没有类型检查 )
CommonJS、AMD与CMD规范的区别:http://blog.csdn.net/jackwen110200/article/details/52105493
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zsXPhrGy-1578037093297)(4.png)]
TypeScript是一种由微软开发的自由和开源的编程语言。它是JavaScript的一个超集,而且本质上向JavaScript语言添加了可选的静态类型和基于类的面向对象编程。安德斯·海尔斯伯格,C#的首席架构师,已工作于TypeScript的开发。2012年十月份,微软发布了首个公开版本的TypeScript,2013年6月19日,在经历了一个预览版之后微软正式发布了正式版TypeScript 0.9,向未来的TypeScript 1.0版迈进了很大一步。
特点:
1).编译型语言( 将 ts 编译成 js ; ts不可以直接执行 )
2).强类型语言( 类似 : Java , C# , 有类型检查 )
3).真正面向对象的语言(继承,接口,封装 ,泛型 …)
4).AMD开发方式。AMD 即Asynchronous Module Definition,中文名是异步模块定义的意思。它是一个在浏览器端模块化开发的规范。
CommonJS、AMD与CMD规范的区别:http://blog.csdn.net/jackwen110200/article/details/52105493
**TypeScript中文文档:**https://www.tslang.cn/docs/handbook/typescript-in-5-minutes.html
TypeScript 教程: https://www.w3cschool.cn/typescript/
用过的人基本都说它好用:https://www.tslang.cn/index.html#download-links
也是未来的趋势
https://nodejs.org/en/ 到官网下载默认安装,安装好后就可以npm包管理器
node -v // 检查是否安装好node
通过npm包管理器安装TypeScript命令行工具
npm install -g typescript // typescript 是一个编译器,负者将ts文件编译成js文件
最后可以在命令行执行tsc
检查typescript是否安装成功
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OU6FDS81-1578037093297)(1.png)]
1.编写typescript文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RaJ7EQDT-1578037093298)(2.png)]
/**
* 定义一个HelloWorld的类
*/
class HelloWorld{
/**定义一个show方法*/
show(){
console.log('show');
}
}
2.将typescript文件编译成js文件
tsc 01-helloworld.ts //将typescript文件编译成js文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WUhmNHUX-1578037093298)(3.png)]
注意:webStrom默认会自动将ts文件编译成js文件
基本类型:https://www.tslang.cn/docs/handbook/basic-types.html
boolean number string Array enum any void null undefined symbol
1.ts定义boolean类型变量
/**js写法*/
var isDone1=true;
/**ts写法*/
var isDone2:boolean=false;
console.log(isDone1,isDone2);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FTZgXWJl-1578037093299)(5.png)]
2.ts文件编译成js文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uhJ61Wah-1578037093300)(6.png)]
3.执行js文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cSUdxztb-1578037093300)(7.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CojaHsHQ-1578037093301)(8.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DjqQxcRJ-1578037093302)(9.png)]
https://www.tslang.cn/docs/handbook/basic-types.html
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wf2wAUqN-1578037093303)(10.png)]
使用数组泛型,Array<元素类型>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rFmfN5Hs-1578037093303)(11.png)]
/**js语法*/
...
/**ts语法*/
enum College2{
IOS,
Android,
HTML5,
UI
}
console.log(College2.HTML5); // 获取枚举的索引 2
console.log(College2[2]); //获取枚举的名称 HTML5
默认情况下,IOS , Android,HTML5,UI从0
开始为元素编号。 你也可以手动的指定成员的数值。 如下图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K34mUfKf-1578037093304)(12.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xsLNtQGB-1578037093305)(13.png)]
/**ts语法*/
enum College2{
IOS,
Android,
HTML5,
UI
}
// 返回的类型是College2枚举类型(number也可以)
var index:College2=College2.HTML5;//获取索引
// 返回的类型是string类型
var College2Name:string=College2[2];//获取枚举名
console.log(index);//获取索引
console.log(College2Name); //获取枚举名
console.log(College2);// 打印枚举对象
是任意类型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6gnLrQ0s-1578037093305)(14.png)]
void声明的变量时,变量 只能为赋予undefined和null
,赋予其它会报错。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vz0vcpM2-1578037093306)(file:///F:/xiaomage/%E8%AF%BE%E4%BB%B6/TypeScript/day01/md/15.png?lastModify=1519607187)]](15.png)
/**ts语法:声明函数的返回类型位string*/
function show2():string{
return 'show2'
}
/**ts语法:声明函数的返回类型位void*/
function show3():void{
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aiYV0dNK-1578037093306)(16.png)]
在编译时, 发现代码中的类型使用有错时会报错
https://www.tslang.cn/docs/handbook/type-inference.html
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fj31cNfj-1578037093307)(17.png)]
在编译时, 发现代码中的类型使用有错时会报错:
error TS2322: Type ‘abc’ is not assignable to type ‘number’.
var arr=[3,'asd',false,3]; // 编译器自动推测其类型为any
arr[4]='sdf'; // 不会报错
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZQmoRfCV-1578037093307)(18.png)]
在编译时 , 发现代码中的类型使用有错时会报错:
error TS2322: Type ‘addf’ is not assignable to type ‘number’.
在编译时, 发现代码有冲突的地方会报错:
error TS2678: Type ‘string’ is not comparable to type ‘number’.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-urHKUQRr-1578037093308)(19.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1Ny26XVW-1578037093309)(20.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HdFjqKeK-1578037093309)(21.png)]
https://www.tslang.cn/docs/handbook/classes.html
1.js创建一个Person类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P12mDmAO-1578037093310)(22.png)]
/*1.构造函数*/
function Person(name,age){
this.name=name;
this.age=age;
}
/*2.添加方法*/
Person.prototype.getName=function () {
console.log(this.name);
}
/*3.新建一个person对象*/
var person=new Person('jack',12);
console.log(person);
2.ts创建一个Person类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VyTelUgx-1578037093310)(23.png)]
/*1.定义一个Person2类*/
class Person2{
/*2.添加属性,并声明属性的类型*/
name:string;
age:number;
/*3.类的构造器*/
constructor(name:string,age:number){
this.name=name;
this.age=age;
}
/*4.定义方法*/
getName():void{
console.log(this.name);
}
}
/*5.新建一个Person对象*/
var person2=new Person2('lili',20);
console.log(person2);
person2.getName()
1.js实现类的继承
原型式继承 , 原型链继承 ,借用构造函数 , 组合继承 …
/**1.js语法*/
/*1.定义一个Person1类*/
function Person1(name,age){
this.name=name;
this.age=age;
}
Person1.prototype.getName=function () {
console.log(this.name);
}
/*2.定义一个Student类*/
function Student(name,age,job){
/*借用构造器函数*/
Person1.call(this,name,age);
this.job=job;
}
/*3.让Student类继承Person1类 (原型链继承)*/
Student.prototype=new Person1();
Student.prototype.constructor=Student;
/*4.给Student类添加方法*/
Student.prototype.getJob=function () {
console.log(this.job);
}
/*5.新建一个Student对象*/
var student=new Student('jack',23,'study');
console.log(student);
student.getJob();
student.getName();
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hqCP0wgo-1578037093311)(24.png)]
2.ts实现类的继承
/**
* Created by liujun on 2018/2/26.
*/
/**2.ts语法*/
/*1.定义一个Person2类*/
class Person2{
/*2.添加属性,并声明属性的类型*/
name:string;
age:number;
/*3.类的构造器*/
constructor(name:string,age:number){
this.name=name;
this.age=age;
}
/*4.定义方法*/
getName():void{
console.log(this.name);
}
}
/*2.定义Student类,并且继承Person2类*/
class Student extends Person2{
/*2.添加属性,并声明属性的类型*/
job:string;
/*3.类的构造器*/
constructor(name:string,age:number,job:string){
/*必须放在最前面,调用父亲的构造函数*/
super(name,age);
this.job=job;
}
/*4.定义方法*/
getJob():void{
console.log(this.job);
}
}
/*5.新建一个Student对象*/
var student=new Student('lili',5,'play');
console.log(student);
student.getJob();
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jjicr85z-1578037093311)(25.png)]
访问修饰符:
1.给变量和方法添加访问修饰符(变量和方法默认都是public)。
/**
* Created by liujun on 2018/2/26.
*/
/**
* 修饰符:
* public 公有,谁都可以访问
* protected 保护,子类可以访问
* private 私有,只能自己访问
* */
/*1.定义一个Person2类*/
class Person2{
/*2.添加属性,并声明属性的类型*/
public name:string;
public age:number;
/*3.类的构造器*/
constructor(name:string,age:number){
this.name=name;
this.age=age;
}
/*4.定义方法*/
public getName():void{
console.log(this.name);
}
}
/*2.定义Student类,并且继承Person2类*/
class Student extends Person2{
/*2.添加属性,并声明属性的类型*/
public job:string;
/*3.类的构造器*/
constructor(name:string,age:number,job:string){
/*必须放在最前面,调用父亲的构造函数*/
super(name,age);
this.job=job;
}
/*4.定义方法*/
public getJob():void{
console.log(this.job);
}
}
/*5.新建一个Student对象*/
var student=new Student('lili',5,'play');
student.name='lose';
console.log(student);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9cfPq28P-1578037093312)(26.png)]
注意:
1.如果修改name属性的访问权限为protected , 那么name这个属性只能在Person2类里面和Student类里面访问。
2.如果修改name属性的访问权限为private, 那么name这个属性只能在Person2类里面访问。
3.如果修改name属性的访问权限为public, 那么name这个属性在Person2类里面,Student类里面或者外部都可以访问
4.如果是方法也是一样的原理
2.参数属性
参数属性可以方便地让我们在一个地方定义并初始化一个类的成员
https://www.tslang.cn/docs/handbook/classes.html
/*1.定义一个Person2类*/
class Person2{
/*3.类的构造器( 构造器里的参数会自动完成属性的定义和初始化 )*/
constructor(public name:string,public age:number){
}
/*4.定义方法*/
public getName():void{
console.log(this.name);
}
}
/*2.定义Student类,并且继承Person2类*/
class Student extends Person2{
...
...
}
/*5.新建一个Student对象*/
var student=new Student('lili',5,'play');
console.log(student);
student.getName();
1.下面使用ts来封装一个Person类。
/**封装一个Person类*/
class Person{
/**private把_name属性隐藏起来,提供get set方法类访问_name属性*/
private _name:string;
private _age:number;/**一般私有的属性,最好有个_下划线*/
public get name(){
return this._name;
}
public set name(name:string){
this._name=name;
}
public get age(){
return this._age;
}
/**这里可以进行容错处理*/
public set age(age:number){
if(age>200 || age<0){
throw '年龄输入有误';
}else{
this._age=age;
}
}
}
var person=new Person();
// person.name='jack'; //这里相当于调用了set name的方法
person.age=230; //如果年龄是不正确的,会报错
// console.log(person.name);
// console.log(person.age);
2.使用js来封装Person类
/**封装一个Person类*/
var Person = (function () {
function Person() {
}
Object.defineProperty(Person.prototype, "name", {
get: function () {
return this._name;
},
set: function (name) {
this._name = name;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Person.prototype, "age", {
get: function () {
return this._age;
},
/**这里可以进行容错处理*/
set: function (age) {
if (age > 200 || age < 0) {
throw '年龄输入有误';
}
else {
this._age = age;
}
},
enumerable: true,
configurable: true
});
return Person;
}());
var person = new Person();
// person.name='jack';
person.age = 230; //如果年龄是不正确的,会报错
// console.log(person.name);
// console.log(person.age);
1.ts定义静态的属性
/**封装一个Person类*/
class Person{
/**定义了一个私有的属性。属于实例级别的属性*/
private _name:string;
/**定义了个一个共有的静态的属性。属于类级别的属性*/
public static eyeNumber:number=2;
public get name(){
return this._name;
}
public set name(name:string){
this._name=name;
}
}
var person:Person=new Person();
person.name='lose'; //访问了set方法
console.log(person.name);//访问了get方法
console.log(Person.eyeNumber); // 直接通过类名来访问
2.js定义静态的属性
/**封装一个Person类*/
var Person = (function () {
function Person() {
}
Object.defineProperty(Person.prototype, "name", {
get: function () {
return this._name;
},
set: function (name) {
this._name = name;
},
enumerable: true,
configurable: true
});
/**定义了个一个共有的静态的属性。属于类级别的属性*/
Person.eyeNumber = 2;
return Person;
}());
var person = new Person();
person.name = 'lose'; //访问了set方法
console.log(person.name); //访问了get方法
console.log(Person.eyeNumber); // 直接通过类名来访问
https://www.tslang.cn/docs/handbook/functions.html
在ts中函数是有类型的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gjea7FOz-1578037093313)(28.png)]
注意:调用的时候参数的个数要一一对上
/**1.js语法*/
function sum1(x,y){
return x+y;
}
var sum2=function (x,y) {
return x+y;
}
/**2.ts语法*/
function sum3(x:number,y:number){
return x+y;
}
console.log( sum3(12,3) );//这个是正确的调用
// console.log( sum3(12) ); //这个是错误的调用
// console.log( sum3(12,3,23) );//这个是错误的调用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ryKRM4II-1578037093314)(27.png)]
1.返回值是基本类型
/**1.返回值是基本类型:只能返回指定的类型*/
function sum1(x:number,y:number):number{
return x+y;
}
var result1:number=sum1(1,4);
console.log(result1);
2.返回值是联合类型
/**2.返回值是联合类型:只能返回指定的类型*/
function sum2(x:number,y:number,type:number):number|string{
if(type==0){
return x+y; //返回number
}else if(type==1){
return x+''+y; //返回string
}
}
var result2:number|string=sum2(1,4,1);
console.log(result2);
什么是给函数签名 ? 1. 要指定函数的参数的个数与对应的类型; 2.要指定函数的返回值类型
函数签名有什么好处? 在开发时可以准确知道函数的参数代表的意义 和 函数的返回值类型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WoJ1d6Do-1578037093314)(29.png)]
下面给匿名函数和回调函数签名
/**1.ts定义的拼接字符的匿名函数*/
var joinStr1=function (x:string,y:number):string {
return x+'=>'+y;
}
console.log( joinStr1('lose',23) );
/**2.给这个joinStr1匿名函数签名*/
var joinStr1:(name:string,age:number)=>string=function (x:string,y:number):string {
return x+'=>'+y;
}
console.log( joinStr1('lose',23) );
/**3.给参数中的callback函数设计签名*/
function ajar(url:string,params:{username:string,psd:string},callback:(result:string,error:number)=>void){
//callback:(result:string,error:number)=>void 这个是对callback函数的签名
//params:{username:string,psd:string} 这个是接口的应用,定义一个约定
}
//调用ajar函数
ajar('https://www.baidu.com',{username:'lisi',psd:'123'},function (result:string,error:number) {
})
https://www.tslang.cn/docs/handbook/functions.html
之前发现函数的参数个数要一一对上 , 能不能解除这个限制?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PdrKm2uv-1578037093315)(30.png)]
/**1.固定参数*/
function buildName1(firstName:string,lastName:string){
return firstName+lastName;
}
console.log(buildName1('li','si')); //正确
// console.log(buildName1('li')); //不正确
// console.log(buildName1('li','li','cai')); //不正确
/**1.可选参数:lastName*/
function buildName2(firstName:string,lastName?:string){
if(lastName){
return firstName+lastName;
}
return firstName;
}
console.log(buildName2('li','si')); //正确
console.log(buildName2('li')); //正确
// console.log(buildName2('li','li','cai')); //不正确
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xdlbfH3g-1578037093315)(31.png)]
/**2.默认参数:lastName*/
function buildName3(firstName:string,lastName='si'){
return firstName+lastName;
}
console.log(buildName3('li')); //正确
console.log(buildName3('li','cai')); //正确
// console.log(buildName3('li','si','cai')); //不正确
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2EEq3PP5-1578037093316)(32.png)]
/**3.剩余参数: ...restOfName: string[] */
function buildName(firstName: string, ...restOfName: string[]) {
return firstName + "-" + restOfName.join("-");
}
let employeeName = buildName("Joseph", "Samuel", "Lucas", "MacKinzie");
console.log(employeeName);
https://www.tslang.cn/docs/handbook/interfaces.html
什么是接口 ? 定义一个规定或者一个约定。注意:typescript中的接口与java中的接口有点不一样
例如:定义一个约定,只要是长和宽相等的四边形就是正方形(正方形Square就是一个接口)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vtl3Weuv-1578037093317)(33.png)]
/**1.定义一个访问网络的函数*/
function ajar(url:string,params:{username:string,password:string},callback:(result:string,error:number)=>void) {
console.log(url,params);
}
/**2.调用一下ajar函数*/
ajar('http://www.baidu.com',{username:'jack',password:'12345'},function (result:string,error:number) {
});
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UgAFfevI-1578037093317)(34.png)]
/**1.定义一个Params接口*/
interface Params{
username:string,
password:string,
id?:number, //这个是可选属性
}
/**2.定义一个访问网络的函数*/
function ajar(url:string,params:Params,callback:(result:string,error:number)=>void) {
console.log(url,params);
}
/**3.调用一下ajar函数*/
var params:Params={username:'jack',password:'12345'}; //实现接口中的属性
ajar('http://www.baidu.com',params,function (result:string,error:number) {
});
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wcT5zxiX-1578037093318)(35.png)]
/**1.定义一个 Params 接口*/
interface Params{
username:string,
password:string,
id?:number, //这个是可选属性
}
/**2.定义一个 CallBack 接口*/
interface CallBack{
(result:string,error?:number):void; // 匿名函数
}
/**3.定义一个访问网络的函数*/
function ajar(url:string,params:Params,callback:CallBack) {
callback('获取数据成功');
console.log(url,params);
}
/**4.调用一下ajar函数*/
var params:Params={username:'jack',password:'12345'}; //使用接口
ajar('http://www.baidu.com',params,function (result:string,error:number) {
console.log(result);
});
/**1.定义一个 Params 接口*/
interface Params{
[index:number]:string,
}
/**2.定义一个访问网络的函数*/
function ajar(url:string,params:Params,callback:(result:string,error:number)=>void) {
console.log(url,params);
}
/**3.调用一下ajar函数*/
var params:Params=['lose','12345']; // 实现接口
ajar('http://www.baidu.com',params,function (result:string,error:number) {
});
类
类型的接口与C#或Java里接口的基本作用一样,TypeScript也能够用它来明确的强制一个类去符合某种约定。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ChL22Zu7-1578037093319)(36.png)]
/**1.创建动物的接口 ( 约定 )*/
interface Animal{
name:string; // 约定的属性
age:number; // 约定的属性
eat(food:string):void; // 约定的非匿名函数
}
/**2.创建Person类 去实现 动物的接口(规范)*/
class Person implements Animal{
name:string;//实现接口中的属性, 没有实现这个规范会报错
age:number;
//实现接口中的函数, 没有实现这个规范会报错
eat(food:string):void{
console.log('吃=>'+food);
}
}
var person=new Person();
person.name='jack';
person.age=12;
person.eat('米饭');
https://www.tslang.cn/docs/handbook/generics.html
软件工程中,我们不仅要创建一致的定义良好的API,同时也要考虑可重用性( 通用性 )。 组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时为你提供了十分灵活的功能。
在像C#和Java这样的语言中,可以使用泛型
来创建可重用的组件,一个组件可以支持多种类型的数据。 这样用户就可以以自己的数据类型来使用组件。
泛型是定义一个
不确定的类型
与any
是不一样。泛型一般使用T来定义
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m0F0TXcm-1578037093319)(37.png)]
/**1.定义一个数组*/
var arr1=[1,2,3]; // 默认的类型是number
var arr2:number [] =[3,4,5]; // 指定类型是number
var arr3=new Array<number>(); // 新建一个数组,并指定其类型(泛型)
var arr4:Array<number>=new Array<number>(); //新建一个number类型的数组
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3o4LtLE6-1578037093320)(38.png)]
/**
* Created by liujun on 2018/2/28.
*/
/**1.定义指定类型的函数*/
function show1(str:string){
return str;
}
console.log( show2('lili') );
/**2.定义any类型的函数*/
function show2(str:any){
return str;
}
console.log( show2(false) );
/**3.定义泛型函数:灵活性高*/
function show3<T>(t:T):T{
return t;
}
console.log( show3<string>('lose') );
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PUHINB2I-1578037093320)(39.png)]
/**4.定义泛型函数的类型:灵活性高,可以适用于不同的类型*/
var show4:(str:string)=>string=function (str:string):string {
return str
}
var show5:<T> (t:T)=>T=function <T> (t:T):T {
return t
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lpPsbVIH-1578037093321)(40.png)]
/**
* Created by liujun on 2018/2/28.
*/
/**1.定义一个普通的GenericNumber1类*/
class GenericNumber1{
value:number;
constructor(value:number){
this.value= value;
}
show(val:number){
console.log(this.value+val);
}
}
var genericNumber1=new GenericNumber1(1); //只能传递number类型
genericNumber1.show(2); //只能传递number类型
/**2.定义一个泛型的GenericNumber1类:通用性,可以适用于不同的类型*/
class GenericNumber2<T>{
value:T;
constructor(value:T){
this.value= value;
}
show(val:T){
console.log(this.value,val); //泛型的变量不能使用+操作符
}
}
var genericNumber2=new GenericNumber2<string>('jack');
genericNumber2.show('lose');
var genericNumber3=new GenericNumber2<number>(100);
genericNumber3.show(200);
zepto.js框架中的模块:https://github.com/madrobby/zepto/tree/master/src
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vAPCCwE7-1578037093321)(41.png)]
/*1.js中定义模块。闭包,及时函数*/
(function () {
})();
/*2.百度地图的模块*/
var BMap;
(function (BMap) {
/**1.定义私有成员*/
var point='我是一个点';
/**2.暴露的公有方法*/
BMap.getPoint=function () {
return point;
}
})(BMap || (BMap={}) );
console.log(BMap.getPoint());
https://www.tslang.cn/docs/handbook/namespaces.html
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u80SvUz7-1578037093322)(42.png)]
/**1.使用ts定义一个BMap模块,namespace 也可以是 module */
namespace BMap{
/**2.定义一个地图Map类*/
export class Map{
public el:any;
constructor(el:any){
this.el=el;
}
/*添加地图的中心点*/
addCenter(point:Point){
console.log(point);
}
}
/**3.定义一个点Point类*/
export class Point{
public x:number;
public y:number;
constructor(x:number,y:number){
this.x=x;
this.y=y;
}
}
}
/**4.使用BMap这个模块Module*/
var map=new BMap.Map('container');
var point=new BMap.Point(116.123434,39.8334234);
map.addCenter(point);
闲聊时刻
10年短信公司,互联网100强企业!主营业务:短信(国内和国际)App H5一键免密登录,防薅羊毛接口,图片OCR,空号检测,活跃号检测,人证核验,活体检测,高防ddos攻击等等200多个企业服务接口!需要的联系他13592366783 官方链接:https://zz.253.com/v5.html#/register?uid=1953
自己公司需求 偶然间 用了一家第三方接口供应商,产品应有尽有,很齐全,对接文档非常详细,彼此都很节约时间,主要非常稳定,包括服务方面很给力,有兴趣的博友,可以联系他,算是对合作伙伴的支持了