TypeScript基础知识
一. TypeScript是js的超集,可以应用所有js语法

二. 特点:
1. 优点
a. 可以在编译阶段就发现大部分错误,这总比在运行时候出错好
b. 同一目录下不同文件中,使用统一命名,会有命名冲突
c. 不显式的定义类型,也能够自动做出类型推论
d. 即使 TypeScript 编译报错,也可以生成 JavaScript 文件
e. Google 开发的 Angular 就是使用 TypeScript 编写的
f. TypeScript 拥抱了 ES6 规范,也支持部分 ES7 草案的规范
g. IDE 智能提示,配合Vscode非常好用
代码重构
可读性高
2. 缺点:
a.有一定的学习成本,需要理解接口(Interfaces)、泛型(Generics)、类(Classes)、枚举类型(Enums)等前端工程师可能不是很熟悉的东西
b. 短期可能会增加一些开发成本,多写一些类型的定义,长期维护的项目,TypeScript 能够减少其维护成本
三. 类型:
1. 原始数据类型:
布尔值、数值、字符串、null、undefined、symbol(表示独一无二的值)、void、any
2. 内置对象类型:
Boolean, Error, Array, Date, Math, RegExp
Document,HTMLElement,Event,NodeList .... MouseEvent
3. 自定类型:
类、接口
四. 原始数据类型
1. 布尔值
let b: boolean = true
let bool: Boolean = new Boolean(true) //接口
2. symbol
表示独一无二的值
let sy: symbol =Symbol("wfa")
3. null及undefined
默认情况下null和undefined是所有类型的子类型。 就是说你可以把 null和undefined赋值给number类型的变量。
//当你指定了--strictNullChecks标记,null和undefined只能赋值给void和它们各自
let nul: null = null
let und: undefined = undefined
nul= 3 //会报错
类型推论
// 如果初始定义为null或者undefined,未指定类型,则类型是any
let nuls = null 或者 undefined
uls = 3 //此时uls类型是any,可以更改
4. void 空
函数的返回值为空,则表示无return。有return,要定义其他类型
如果函数不指定类型,会进行类型推论。无return是void,有则依据返回值
function fn(): void {
console.log(10)
}
//返回值1
function fn(): number {
return 1
}
5. any 任意类型
let an: any = "a"
an = 1 //任意类型可以改变
五. 内置对象类型
1. 获取属性
<body>
<div class = "box" ></div>
<h1>good</h1>
</body>
<script src="./04-内置对象.js"></script>
let box:HTMLDivElement = document.querySelector("div">
let html:HTMLElement = document.documentElement
let html:HTMLElement = document.body
let h1:HTMLHeadingElement = document.querySelector("h1")
box.onmouseenter = funtion(e:MouseEvent):void{
console.log()
}
2. 数组
语法:let 数组名: 类型名[ ] = 值
第一种:以在元素类型后面接上 [],示由此类型元素组成的一个数组:
let arr:number[ ] = [1,2,3,4]
//let arr4:number[] = [1,2,3,"a"] //报错:"a"不是number类型
第二种:是使用数组泛型,Array<元素类型>
let list: Array<number> = [1, 2, 3];
3. 函数
第一种:函数形式:
function 函数名( arg1:类型名, arg2:类型名): 返回值类型名{}
function fn(a:number, b:number|string):number{return 1}
const fn2 = function(a:number,b:number):number{ return 1 }
const fn3 = (a:string,b:string): number => 1
第二种:接口中函数的定义:
interface 接口名称{
//输入类型(参数): 输出类型(返回值)
(a:number,b:number):number
}
//接口定义
interface FnInter{
(a:number, b:number):number
}
//使用接口后相当于:
//const fn = function(a:number,b:number):number{ return 1 }
const fn:FnInter =(a,b) => 1
//调用函数
fn(1,1)
4. 对象
对象类型:依赖接口 | 类 来描述, 不给类型可以推论
a. 接口
属性用法:
1.不加任何符号:必传属性(不能少)
2.readonly: 只读属性(不能修改)
3.?: 可选属性
4.[propName: string]: any 任意属性 (也可以约定属性)
例子:
interface ObjInter {
readonly id: number,
name ?: string,
age: number,
[propName:string]: any
}
const obj:ObjInter = {
id: 2,
name: "ja",
age: 12,
c: 1, //任意属性
d: 3 //任意属性
}
//obj.id =3 //将会报错,因为 id是只读属性
obj.name = "good"
六. 联合类型
1. 数组联合
联合类型不同于any
let arr:(number | string)[] = [1,"a",1]
let arr:(number | string | boolean)[] = [1,"a",1,true]
let list: Array<number | string> = [1, "a",3,5,"b"];
2. 基本数据类型联合
let ja: number | string =2
//ja的类型:是number联合string类型
ja="ja2"
七. 泛型
概念:
泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而 在使用的时候再指定类型的一种特性。
比喻:
女朋友/男朋友类型,当前不确定,最后才知道
第一种是,传入所有的参数,包含类型参数:
let output = identity<string>("myString"); // type of output will be 'string'
这里我们明确的指定了T是string类型,并做为一个参数传给函数,使用了<>括起来而不是()。
第二种方法更普遍。利用了类型推论 -- 即编译器会根据传入的参数自动地帮助我们确定T的类型:
let output = identity("myString"); // type of output will be 'string'
注意我们没必要使用尖括号(<>)来明确地传入类型;编译器可以查看myString的值,然后把T设置为它的类型。
例子:
//函数泛型
const fn =function <A,B>(a:A,b:B): A {
return a
}
fn(1,2)
//接口泛型:
interface FnInter<B>{
(a:B):B
}
//返回值也是number类型
const fn:FnInter<number> = ()=>1
fn(1)
八. 类型断言
我们需要在还不确定类型的时候就访问其中一个类型的属性或方法
其一是“尖括号”语法:
let someValue: any = "this is a string";
let strLength: number = (<string>someValue).length;
function fn(a: number | string ):boolean{
if((<string>a).length)
}
另一个为as语法:
let someValue: any = "this is a string";
let strLength: number = (someValue as string).length;
两种形式是等价的。 至于使用哪个大多数情况下是凭个人喜好;然而,当你在TypeScript里使用JSX时,只有 as语法断言是被允许的。
例子 :
function fn(a: number | string):boolean{
//只有string类型的a2,才会true
if((<string>a).length){
return false
}
if((a as string).length){
}
//会报错,number类型a,不存在length属性
//if((<number>a).length){
//}
return true
}
console.log(fn("1")) //false
九. 类实现接口:
1. 好处:
a. 复用性高
b. 书写习惯
2.比喻:
门是一个类,防盗门是门的子类。防盗门有一个报警器的功能,给防盗门添加一个报警方法。车类,也有报警器的功能,就可以考虑把报警器提取出来,作为一个接口,防盗门和车都去实现它
3. 例子:
类实现多个接口:class 类 implements 接口1,接口2{}
class A implements A_InterFace,B_Interface{
public a = 1
public fn = (a,b) => { return 'a'}
public b = 2
public c = (n,m) => n+m
}
interface A_InterFace{
a: number,
fn: (a:number,b:string) => string
}
interface B_Interface{
b: number,
c: (n:number,m:number) => number
}
TypeScript基础知识的更多相关文章
- Typescript 基础知识
Typescript 就是 Javascript 的超集,所以首先你要知道 Javascript 基础知识 类型注解 类型注解在TypeScript中是记录函数或变量约束的简便方法. // 布尔值 l ...
- Angular 4 学习笔记 从入门到实战 打造在线竞拍网站 基础知识 快速入门 个人感悟
最近搞到手了一部Angular4的视频教程,这几天正好有时间变学了一下,可以用来做一些前后端分离的网站,也可以直接去打包web app. 环境&版本信息声明 运行ng -v @angular/ ...
- CodeMix入门基础知识
CodeMix在线订购年终抄底促销!火爆开抢>> CodeMix入门 CodeMix是一个Eclipse插件,可以直接从Eclipse访问VS Code和为Code OSS构建的附加扩展的 ...
- vue基础知识之vue-resource/axios
Vue基础知识之vue-resource和axios(三) vue-resource Vue.js是数据驱动的,这使得我们并不需要直接操作DOM,如果我们不需要使用jQuery的DOM选择器,就没 ...
- Vue基础知识之vue-resource和axios
Vue基础知识之vue-resource和axios 原文链接:http://www.cnblogs.com/Juphy/p/7073027.html vue-resource Vue.js是数据驱 ...
- .NET面试题系列[1] - .NET框架基础知识(1)
很明显,CLS是CTS的一个子集,而且是最小的子集. - 张子阳 .NET框架基础知识(1) 参考资料: http://www.tracefact.net/CLR-and-Framework/DotN ...
- RabbitMQ基础知识
RabbitMQ基础知识 一.背景 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然 ...
- Java基础知识(壹)
写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...
- selenium自动化基础知识
什么是自动化测试? 自动化测试分为:功能自动化和性能自动化 功能自动化即使用计算机通过编码的方式来替代手工测试,完成一些重复性比较高的测试,解放测试人员的测试压力.同时,如果系统有不份模块更改后,只要 ...
随机推荐
- apache kafka监控系列-KafkaOffsetMonitor
apache kafka中国社区QQ群:162272557 概览 近期kafka server消息服务上线了,基于jmx指标參数也写到zabbix中了.但总认为缺少点什么东西.可视化可操作的界面. z ...
- UVa 11849 - CD
题目:给你两个有序序列(每一个序列中元素不同),求两序列中都出现的元素个数. 分析:简单题. 合并排序合并过程. 设置两个指针.指向两序列当前元素.那个元素小指针向后移动.相同大则计数加一,同一时候后 ...
- mysql通过DATE_FORMAT将错误数据恢复
因为如今新开发项目,同事造数据的时候,将时间类型格式造成"20150708".可是实际希望的数据格式是:"2015-07-08" . 数据库使用的是mysql. ...
- MVC5发展历程,从MVC2谈起
目前,MVC已经发布了5个版本,不包括一些临时的版本,为了更好的了解MVC5,知道MVC的发展历程是非常重要的.本篇随笔主要讲解3个版本的内容及其新特性. 1.MVC 2,发布日期:2010年3月 部 ...
- Ubuntu16.04 “有线未托管”有线网络不可用问题解决
Ubuntu16.04 “有线未托管”问题解决 电脑上安装的Ubuntu16.04 是通过先安装Ubuntu Server后在通过命令 sudo tasksel 安装的Gnome桌面环境,安装完成后发 ...
- 【转】一篇关于32位Linux内核使用大内存的文章——Hugemem Kernel Explained &nb
红旗DC系列Linux操作系统(x86平台)中带有四类核心: UP (支持单内核) SMP (支持多内核) hugemem Icc* (用intel C编译器编译的核心) 其中hugemem核心往往引 ...
- 紫书 例题 9-14 UVa 1218 (树形dp)
这道题有个初始值设成1e9, 然后这个值是要加很多次的,然后就会溢出变成负数, 然后就一直WA, 找这个bug找了一个小时--以后不能随便这样设那么大, 要考虑会不会加很多次然后溢出. 讲一下思路. ...
- 今日SGU 5.14
//SGU 131 还没完全想清楚 留坑 SGU 259 题意:一个机器处理n个任务,每个任务有时间t和传送时间l 收获:贪心 #include<bits/stdc++.h> #defin ...
- JS 中 this 与闭包的结合产生的问题
代码片段一: var name = "The Window"; var object = { name : "My Object", getNameFunc : ...
- Swift之 vm10虚拟机安装Mac OS X10.10教程
VM10装Mac OS X 10.9.3及更新到Mac OS X 10.10,让你的windows也能玩Swift . 近期WWDC放出终极大招--新的编程语言Swift(雨燕),导致一大波程序猿 ...