npm install -g typescript #安装typescript 工具tsc编译器 tsc a.ts #输出 a.js node a.js #运行js
typescript 通过tsconfig.json 文件配置。
可通过gulp 等工具管理项目自动化编译和运行。
boolean 布尔、number 数字、string 字符串、enum 枚举、any 任意、void 空、null 空值、 undefined 未定义、symbol 符号值、object 对象、never 不存在。
let isdone:boolean = false; let name:string = "普通字符串"; let firstname:string = `模板字符串${isdone}`; //支持插入和换行 enum color{red=0,green=2,blue=4} let c:color = color.green; let notsure:any = 4; notsure = "字符串也行"; let voidvalue:void = undefined;//只有undefined或null两个值。 let u:undefined = undefined; let n:null = null; let sym:symbol = symbol(); //唯一存在,可用作对象成员的键 let o:object = {};//除boolean、number、string、symbol、null、undefined外的类型 ():never=>{throw "";}; //用来定义没有返回路径的方法。该类型是所有类型的子类型。
注意:
[] 数组
let list:number[] = [1,2,3]; let genlist:array<number>=[1,2,3]; //泛型数组
let x:[string,number] = ['hello',10];
"s"|"n"|"m"
用竖线分隔的字面量限定字符串变量的可选值。1|2|3|4
数字变量的可选值。接口做类型的声明,而没有具体实现。
interface 接口名 extends 可选的父接口{ color?:string; //可选属性 width:number; readonly x:number;//只读属性 [propname:string]:any; //索引属性,如s["name"],其他属性类型必须兼容索引属性 [index:number]:any; //数字下标做索引,s[1] 等价 s["1"] (start:number):string; //实例成员函数 new():object; //初始化构造函数 }
类类型可以实现接口。类分两部分,静态部分和实例部分,类构造函数属于静态部分,而接口实现属于实例部分。
interface face{ data:string; } class ca implements face{ data:string; //实现接口 //初始化构造函数 constructor(h:number,m:number){ this.data = h + m; } private state:any;//私有属性 } //接口可以继承自类,包含类的相关声明,包括私有。因此,一般只有父类的子类才能实现该接口。 interface ia extends ca{ new(state:any):face{} }
extends
继承基类implements
实现接口super()
调用基类初始化this
实例对象public/protected/private
访问权限。只有public成员才具有结构性兼容的便利readonly
只读属性constructor()
构造函数constructor(public a:number, readonly b:string)
参数属性。具有特殊修饰符的a,b自动成为对象成员get set
存储器。读取属性的函数static
静态属性。类属性abstract
抽象类,抽象成员函数let myfun:(a:number,b:string)=>boolean; //函数类型 function fun2(a:number,b:string):boolean{} //函数 let fun3=function(){};//匿名函数 let fun4=()=>1;//箭头函数
function myfun(arg?:number):void{} //?代表可选 let fun2=(name="bill")=>void;//默认参数 function fun3(a:number, ...s:number[]){} //s是剩余参数
function f(this:void){} //禁用this class a{ f1():this{return this;} } class b extends a{ f2():this{return this;} } let a:b = new b(); a.f1().f2(); //f1返回的this自动成为子类型
for..of
语句调用对象上的迭代器symbol.iterator
函数。for..in
语句迭代对象的键,适用任何对象//变量声明 let 变量名:可选的类型 = [1,2]; //字面量 //常量声明,即不能修改的变量 let 常量名:可选的类型 = [1,2]; //解构数组 let [a, b]:可选的类型 = [1,2]; //a=1,b=2 let [a, ...b] = [1,2,3,4]; //a=1,b=[2,3,4] //解构对象 let {a,b} = {a:1,b:2,c:3};//a=1,b=2 let {a:newa,c}={a:1,b:2,c:3};//newa=1,c=3;属性名a修改成newa //展开数组 let a:number[] = [0,...[1,2],3];//a=[0,1,2,3];展开数组[1,2] //类型断言,绕过某些编译器类型检查 let a:string= 1 as string;
用标记来代替特定类型,或者替代类型的一部分。
<t>
指定泛型标志的适用范围。
let f:<t extends interface>(arg:t)=>t;
u & t
合并u和t两类型成员u | t
u,t的联合体,值为其中之一,成员为共有的相同成员keyof
索引类型查询,得到公共属性名的联合t[k]
其中,k extends keyof t
,即k是联合类型其中一个。结果是t.k[key in keyof t]:p
迭代t的属性联合,产生对应的对象属性,并设置类型为p。预定义映射:
exclude<t,u>
剔除uextract<t,u>
提取unonnullable<t>
剔除null和undefined。returntype<t>
获取函数返回类型instancetype<t>
获取构造函数实例类型。readonly<t>
映射为只读版本partianl<t>
可选版本pick<t,k>
摘录版本record<string,r>
将联合映射为对象,成员类型rts中使用了结构作为类型兼容的标准,也就是只要结构相容,就是相容,而不需要明确的类型命名声明。
结构包含:
相容的意思是指:
let a:a = b as b;//a兼容b
//复杂例子 let a:{x:number,y(a1:{k:1,k2:2}, a2:never):{r:number}}= {x:1, y: (m:{k:1})=>{return {r:1};}}
():is 类型
类型推断谓词typeof
instanceof
| ||
可null联合类型相关符号? undefined
可选类型相关符号type
别名模块加载器 commonjs(node.js) 或 require.js(amd); umd,systemjs,es6/es2015。
export
标识要导出的内容。import
导入。export default
默认导出,导入时可以不指定对应的名字export =
commonjs语法import module=require(”module“)
commonjs语法declare
ts声明格式declare module
ts声明模块namespace
命名空间import x= ns.cla
x是别名@装饰器
是一个函数,会在被装饰的对象运行时调用。reflect-metadata
是元数据库。
return class extends {new(...args:any[]):{}}{}
如对本文有疑问, 点击进行留言回复!!
vue源码实战render.js与$nextTick的异步调用
同事牛逼啊,写了个隐藏 bug,我排查了 3 天才解决问题!
【JavaScript笔记(一)】万丈高楼平地起 - 基本概念篇
网友评论