ts
或者ts2
皆指typescript
;这不是一个合格的手册,要想深刻和更全应该看官方的手册文档加以练习和尝试javascript
ts
不是编程语言,能够理解为一种补充(超集),让JS具备后端的部分特色(类型推断)ts
不等同于js,可是能够理解为相似CoffeeScript
,能够编译成js,跨平台且项目是开源的ts
对于ECMAScript
的特性和支持一直很超前ECMAScript
的部分特性仍是参考ts
的,其实微软也是TC39
委员会成员之一啦implements
,extends
,inteface
,abstract
等。。C#
风格,目前最新版本是typescript 2.2
,我简称它为ts2
注:文章的部份内容是会结合实际应用经验来讲,基于ts
最新的2.2来讲;java
众所周知:JS中有这么几种类型的数据: Symbol
,boolean
,Number
,Object[Array在js中也属于对象]
,undefind
,null
,String
;jquery
那么在TS中如何来声明一个变量或者对象亦或者声明返回对象的值类型呢?git
// 最简单的一个声明, 在须要推导的后面加上冒号和类型
let a: number;
/*可是有些人有强迫症的,好比会出现这类的写法,可是这类写法在最新版 *中会变成一个警告,说是该类型不必再写推导类型了,建议移除; */
let b: number = 0; // 会出现警告,应该改为下面这个
let c: boolean = false;
let b = 0; // 推荐的写法;
let c = false;
//--------------- 在TS中类型会比JS稍微多一些,记得ts中类型所有是小写---------------//
let temp1: number; // 二进制,八进制,浮点,整数皆归这类
let temp2: string; // 字符串类型,ES6的模板字符串也属于这货
let temp3_1: number[]; // 表明返回值均为数字的数组
let temp3_2: Array<any>; // 数组泛型,表明数组内能够包含全部类型
let temp3_3: [string,number,boolean]; 元组数组,子元素的类型强制一一对应
let temp4: any; // any表明任意类型均可以,万金油
let temp5: void; // 只能赋值undefined或者null
let temp6: undefined; // 只能赋值undefined,在--strictNullChecks模式下只能赋值给: void
let temp7: null; // 只能赋值null,在--strictNullChecks模式下只能赋值给: void
let temp8: object; // 相似Object.create的皆能够
//------ 特殊类型
// 对于异常这类的永远得不到正确返回值的,使用: never
try{
...
}catch(e): never{
...
}
// 不须要推断的--- 类型断言,简言之,我不须要ts推导,原本就知道这货是什么
// 最多见的是用于引入一些第三方的js库的时候,好比echarts的做用域必须全局window
const echarts = (<any>window)['echarts'];
复制代码
ts中的做用,能够简单的理解为规范类型es6
export interface Personal{
name: string;
age: number;
sex: string;
colthColor?: string[]; // 衣服颜色,[?]可选参数,返回字符串数组
readonly idCard: number | string;
/* readonly是新版本加进来的,和const大同小异, *二者区分readonly用于接口声明而const能做用于变量, *后面number | string其实另一部分的内容点,叫作联合推导,就是值能够是数字或者字符串 */
// 接口也能描述函数参数这些,写法都差很少
}
//------使用,好比用于接口上传 ----- 记得导入
// 接口内的字段及类型会强制对应,否则会报错,这会让代码更加严谨;
uploadUserInfo( personalParam: Personal ): Observable<any> {
return this.authHttp.upload( environment.baseUrl + 'xxxx/UpdateInfo', personalParam );
}
// 接口也能够用实现某些方法,和C#或Java里接口的基本做用同样
// 关键字implements
export class MitUpdateUserInfo implements Personal{
...
}
// 接口与接口之间能够实现单继承或者多继承
// 关键字extends
interface extraParam{
favority:any
}
interface Personal extends extraParam{
....
}
复制代码
ts内的类其实就是es6的类写法,只是能够完整支持而已github
export class test{
public a: number; // 在类直接声明的做用域整个类内,默认为public,写不写看本身了
constructor(){
// 构造函数,构造函数必须能够带上什么范围
// public,private,protected
}
test(){
函数。。。。
}
}
/** 修饰符:更细致的解释请看官方文档手册 * public : 默认,公共开放 * private: 自身类使用 * protected : 派生类可使用【子类这类】 * readonly : 只读 */
// 同理类也是必然能够继承的,可是不能多继承,不能多继承,不能多继承
// 依旧关键字是extends
export class test1{
constructor(private hh:string){
this.hh = hh;
}
test(a){
console.log(this.hh + a);
}
}
export class test2 extend test1{
public a = 'sfasdf';
constructor(a:string){
super(a);
}
test(){
super.test(); // 继承方法
}
}
// 固然,类中不可能少了抽象类,这货的做用就是让一堆人继承实现它带的东西
export abstract class test3 {
constructor(public name: string) {
}
eat(): void {
console.log(this.name + '吃吃吃');
// 能够在抽象内实现默认方法,而后子类复写或者直接用
}
abstract move(): void; // 等着子类来实现动的方法
}
// 也有set和get,就是getter和setter
复制代码
exrpot class test4{
constructor(){}
sun(leaf:string,drink?:boolean):void{
...
// 传入的参数leaf为字符串类型,该方法没有任何返回
// 水为可选参数,传入为布尔类型
}
}
// 应该有人想问this,可是this的范围该怎么样就怎么样,在被调用的上下文中肯定
//适量的使用箭头函数会让你写起来更舒服
复制代码
// TS中的泛型只能用于接口,类(实例),不能用于枚举和命名空间
// 泛型用符号T表示,不必定要用<T>的写法
identity<T>(arg: T): T {
return arg;
}
复制代码
// 这里拿官方的文档例子就很清晰了。。
enum Enum {
A
}
let a = Enum.A;
let nameOfA = Enum[Enum.A]; // "A"
复制代码
交叉类型就是复合类型,把多种类型汇总为一种类型,用 & 符号关联 , 常见用于多个对象的组合typescript
test(args1: A,args2: B ): A & B{
...
}
复制代码
就是类型能够或!!!编程
let a: number | string | null; // 即a能够赋值为这三种类型的任意一种
复制代码
至此,TS2的常规用法相信大部分小伙伴都能只知其一;不知其二了。json
至于更深刻的,其实用的并很少,我本身也没用到那些;后端
而【d.ts
和tsconfig.json
的写法请看官方文档,有很详细的教程】, 安装这些就不说了
在这里汇总下我以前遇到的问题及解决方案;
引入第三方库该怎么破,好比主流的jquery啥米的,会报类型错误啥的。。 传送门:github.com/DefinitelyT… 安装对应的types,便可解决。。。至于上面没有的只能本身动手丰衣足食了【看官方文档而后本身写个】; 而后放到对应的文件顶部,用/// <reference types="..." />
引入
如何声明一个全局变量? 写一个公用的xx.d.ts
;在里面用写,大体以下
declare var System: any;
declare var $: any;
declare var jQuery: any;
declare var _: any;
declare var echarts: any;
declare var BMap: any;
declare var BMapLib: any;
复制代码
额外的一堆堆的废话,有些新人常常在群里问ES6模块导入有几种方式和什么意思,这里我也来个解释。。
// 从组件中导入AppComponent这个类
import { AppComponent } from './app.component';
// 导入全部内部能够导出的
import * from './app.routes';
// 导入某个功能而且把它别名化(alias)
import { MitNotificationsModule as notify } from './widgets/mit-notifications/mit-notifications.module';
// 导入两个功能(成员)
import { UserAdd , UserDelte } from "User.module";
// 上面两个的结合
import { UserAdd , UserDelte as d } from "User.module";
// 导入默认成员及成员
import defaultMember, { UserAdd } from "User.module";
// 导入默认成员且重命名
import defaultMember, * as name from "module-name";
// 导入整个模块,慎重使用,尽可能导入一些你须要用到的,避免这种,有可能大家有部分代码会影响全局
import "global.module";
//------- 说了导入,那么顺便扯扯导出把
// 导出的花样也挺多,下至变量常量,上至对象函数
// 比较有差别的就是default 。。 其余的和上面大体对应
export default const name = 'crper'; // 默认成员,一个模块只有一个至多一个默认
export { a , b} // 导出a,b
....
复制代码