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自动化基础知识
什么是自动化测试? 自动化测试分为:功能自动化和性能自动化 功能自动化即使用计算机通过编码的方式来替代手工测试,完成一些重复性比较高的测试,解放测试人员的测试压力.同时,如果系统有不份模块更改后,只要 ...
随机推荐
- vim 脚本之快捷注释
今天初步学习了下vim的脚本知识,并尝试写了一个简单的脚本.当然,这个脚本很简单,使用的方法也很笨拙.不过,这仅仅是一个开始,等以后随着对vim语法的深入了解,会不断优化这个脚本的.先记录下来 &qu ...
- 25.内置API
转自:https://www.cnblogs.com/best/tag/Angular/ 3.1.数据转换 示例: 默认情况JavaScript中对象是传引用的: var tom={name:&quo ...
- centos 项目上线shell脚本
最近在弄项目上线,然后写了个上线,备份,回滚的shell脚本 上线可根据自己公司项目做相关操作,备份回滚可修改目录则可实现 主管要求用shell写,那就用shell写吧 本想Python写更好的 哈哈 ...
- orm 通用方法——QueryModelCount条件查询记录数
定义代码: /** * 描述:根据条件查询对象数 * 作者:Tianqi * 日期:2014-09-17 * param:model 对象实例 * param:cond 查询条件 * return:i ...
- POJ2823 单调队列
POJ2823 http://poj.org/problem?id=2823 最基础的单调队列,说是数据结构,其实就是一种更新数组数据的方法. 之前还准备用deque,超时了,直接head,tail快 ...
- js中运算符优先级问题
其实事情是这样的,最近看到不少朋友讨论一道据说不知道哪儿的笔试题目,题目如下: var a = {n:1}; var b = a; a.x = a = {n:2}; 请写出a.x的值. 当然通过运行, ...
- file---探测给定文件的类型
file命令用来探测给定文件的类型.file命令对文件的检查分为文件系统.魔法幻数检查和语言检查3个过程. 语法 file(选项)(参数) 选项 -b:列出辨识结果时,不显示文件名称: -c:详细显示 ...
- Maven学习总结(20)——Maven pom.xml配置再体会
Maven的pom.xml配置文件详解 <!--父项目的坐标.如果项目中没有规定某个元素的值,那么父项目中的对应值即为项目的默认值. 坐标包括group ID,artifact ID和 vers ...
- CSS 类、伪类和伪元素差别具体解释
CSS中的类(class)是为了方便过滤(即选择)元素,以给这类元素加入样式,class是定义在HTML文档树中的. 可是这在一些情况下是不够用的,比方用户的交互动作(悬停.激活等)会导致元素状态发生 ...
- 为什么我们须要复杂的password
前两天我打开邮箱一看.收到公司1331一封要求改动邮箱password的邮件. 为什么我们须要一个复杂的password呢?尽管我一直以来设置的password都非常复杂.可是公司这次要求改动pass ...