vue.js 学习笔记3——TypeScript
vue.js 学习笔记3——TypeScript
工具
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 "";}; //用来定义没有返回路径的方法。该类型是所有类型的子类型。
注意:
- ts中object和null不相容
- object和基础类型都不相容
- any是根类型,never是叶子类型
- 严格选项下,null和undefined除自身和void都不相容
数组
[] 数组
let list:number[] = [1,2,3];
let genList:Array<number>=[1,2,3]; //泛型数组
元组
let x:[string,number] = ['hello',10];
枚举
- const enum 常量枚举会被用值直接替换
- 枚举是一个对象,数值类型会有属性双向映射
- 用字面量或者无初始化的枚举的成员是一个类型,值就是该枚举成员。该枚举是一个联合
- 枚举成员初始化是简单常量算式,为常量成员,否则为计算成员
- 枚举成员可以是数字或字符型
- 外部枚举成员默认是计算成员
字面量
"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是剩余参数
this对象和类型
- function定义的的函数,会在调用它时绑定上下文this变量。即this类型为any。
- 箭头函数则会在定义它的上下文绑定this变量。
- this作为函数返回类型,可以用在继承系统里面串联调用子类对象成员函数。
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自动成为子类型
重载
- ts中给出不同函数重载的声明,这样就启动了函数参数的类型检查,定义只需要给出一份。用any参数来实现,但它不是重载。
- 注意!ts不能有多个实现。
迭代器 Symbol.iterator
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 | TU,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>将联合映射为对象,成员类型R
类型兼容
ts中使用了结构作为类型兼容的标准,也就是只要结构相容,就是相容,而不需要明确的类型命名声明。
结构包含:
- 公共成员名称和类型
- 函数参数排列和返回类型
- 私有和保护成员不适用该系统。
相容的意思是指:
let a:A = b as B;//A兼容B- A的所有成员,B都有
- 如果A是函数,B的参数,A都有(或B参数兼容A参数),且排列顺序一致。因为js中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 类型类型推断谓词typeofinstanceof| ||可null联合类型相关符号? undefined可选类型相关符号type别名
模块和命名空间
模块加载器 CommonjS(node.js) 或 Require.js(AMD); UMD,SystemJS,ES6/ES2015。
export标识要导出的内容。import导入。export default默认导出,导入时可以不指定对应的名字export =commonjs语法import module=require(”module“)commonjs语法- 只要在顶层使用关键字,文件即可成为模块,否则全局可见
declarets声明格式declare modulets声明模块namespace命名空间import x= ns.clax是别名- 推荐使用模块来组织代码。
装饰器
@装饰器 是一个函数,会在被装饰的对象运行时调用。reflect-metadata是元数据库。
类装饰器:
- 参数1,类构造函数
- 可以返回修改后的构造对象,
return class extends {new(...args:any[]):{}}{}
函数装饰器:
- 参数1,静态,类的构造函数;实例成员为类的原型对象。
- 参数2,成员的名字
- 参数3, 成员的属性描述符
- 可返回属性描述符
属性装饰器:
- 类构造或原型对象
- 成员名字
参数装饰器:
- 类构造或原型对象
- 成员名字
- 参数在函数参数列表中的索引
vue.js 学习笔记3——TypeScript的更多相关文章
- Vue.js学习笔记(2)vue-router
vue中vue-router的使用:
- Vue.js学习笔记:在元素 和 template 中使用 v-if 指令
f 指令 语法比较简单,直接上代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " ...
- Vue.js——学习笔记
Vue-自学笔记 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅 ...
- Vue.js——学习笔记(一)
Vue-自学笔记 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅 ...
- Vue.js 学习笔记之二:数据驱动开发
在 Vue.js 框架中,与 HTML 页面元素的交互方式没有像原生 JavaScript 接口那么直接,它是通过先在 HTML 元素标签中嵌入一系列类似于普通标签属性的 Vue 指令属性来绑定数据, ...
- Vue.js 学习笔记之三:与服务器的数据交互
显而易见的,之前的02_toDoList存在着一个很致命的缺陷.那就是它的数据只存在于浏览器端,一但用户关闭或重新载入页面,他之前加入到程序中的数据就会全部丢失,一切又恢复到程序的初始状态.要想解决这 ...
- Vue.js 学习笔记之四:Vue 组件基础
到目前为止,这个系列的笔记所展示的都是一些极为简单的单页面 Web 应用程序,并且页面上通常只有几个简单的交互元素.但在实际生产环境中,Web 应用程序的用户界面往往是由多个复杂的页面共同组成的.这时 ...
- Vue.js 学习笔记之五:编译 vue 组件
正如上一篇笔记中所说,直接使用 ES6 标准提供的模块规范来编写 Vue 组件在很多情况下可能并不是最佳实践.主要原因有两个,首先是市面上还有许多并没有对 ES6 标准提供完全支持的 Web 浏览器, ...
- Vue.js 学习笔记 一
本文的Demo和源代码已放到GitHub,如果您觉得本篇内容不错,请点个赞,或在GitHub上加个星星! https://github.com/zwl-jasmine95/Vue_test 以下所有知 ...
随机推荐
- C# Memory Cache 踩坑记录
背景 前些天公司服务器数据库访问量偏高,运维人员收到告警推送,安排我团队小伙伴排查原因. 我们发现原来系统定期会跑一个回归测试,该测运行的任务较多,每处理一条任务都会到数据库中取相关数据,高速地回归测 ...
- MVC、MVP、MVVM 模式对比
MVC.MVP和MVVM这些开发模式为了分离视图(View)和模型(Model)而提出来的,直白说就是为了前后端分离. 1. MVC(Model View Controller)模式 MVC是比较直观 ...
- FPGA高速ADC接口实战——250MSPS采样率ADC9481
一.前言 最近忙于硕士毕业设计和论文,没有太多时间编写博客,现总结下之前在某个项目中用到的一个高速ADC接口设计部分.ADC这一器件经常用于无线通信.传感.测试测量等领域.目前数字系统对高速数据采集的 ...
- Windows Server 2016-批量设置用户下次登陆须更改密码
Powershell设置某OU下所有用户下次登陆必须更改密码: Get-ADUser -Filter * -SearchBase "ou=syncall,dc=azureyun,dc=com ...
- IM开发者的零基础通信技术入门(二):通信交换技术的百年发展史(下)
1.系列文章引言 1.1 适合谁来阅读? 本系列文章尽量使用最浅显易懂的文字.图片来组织内容,力求通信技术零基础的人群也能看懂.但个人建议,至少稍微了解过网络通信方面的知识后再看,会更有收获.如果您大 ...
- Ubuntu16 FTP的安装,基本配置与权限控制
1.ftp与sftp 大致了解下: ftp是一个文件传输协议,linux环境需要它才能支持文件的传输与查看,它的默认端口是21. sftp是加密/解密的文件传输协议,因为它每次传输都有加密解密的步骤, ...
- Django rest framework源码分析(1)----认证
目录 Django rest framework(1)----认证 Django rest framework(2)----权限 Django rest framework(3)----节流 Djan ...
- Elasticsearch倒排索引结构
一切设计都是为了提高搜索的性能 倒排索引(Inverted Index)也叫反向索引,有反向索引必有正向索引.通俗地来讲,正向索引是通过key找value,反向索引则是通过value找key. 先来回 ...
- Sql Server 的参数化查询
为什么要使用参数化查询呢?参数化查询写起来看起来都麻烦,还不如用拼接sql语句来的方便快捷.当然,拼接sql语句执行查询虽然看起来方便简洁,其实不然.远没有参数化查询来的安全和快捷. 今天刚好了解了一 ...
- Elasticsearch之索引模板index template与索引别名index alias
为什么需要索引模板? 在实际工作中针对一批大量数据存储的时候需要使用多个索引库,如果手工指定每个索引库的配置信息(settings和mappings)的话就很麻烦了. 所以,这个时候,就存在创建索引模 ...