typescript相关知识点总结
本文讲解typescript语法
由于js语法本身的混乱,再加上目前框架的割据,导致typescript用起来没有一致性,本文尽量总结实际开发中可能会用到的知识点
目录
数据类型
类型断言
duck typing
函数类型的验证
索引验证
类验证
接口扩展
泛型
与第三方库一起使用
命名空间
react组件属性验证
- 
Boolean 布尔类型 let isDone: boolean = false;
 Number 数字类型 let num: number = 5;
 String 字符串类型 let str: string = 'aa';
 Array 数组
 let list: number[] = [1, 2, 3];
 let list: Array<nubmber> = [1, 2, 3];
 let list: [string, number] = ['aa', 11];
 let arr: ReadonlyArray<number> = [1, 2, 3]; // 只读数组
 Enum 枚举类型,是typescript对javascript语法的扩展类型
 枚举类型用来将一组无意义的数值转变成识别度高的属性
 enum Color {Red, Green, Blue} // 声明枚举
 let a: Color = Color.Grean // 1
 let a: string = Color[2]; // Blue
 枚举值,默认从0开始递增,可以手动赋值
 Any 类型,是typescript自己扩展的类型
 any类型的作用就是用来暂时关闭类型验证,对此变量不做任何类型的验证,我不推荐用这个类型,建议Object代替
 let a: any = 1;
 Object 类型,是typescript自己扩展的类型
 Object类型的作用,是表示此变量可以为任意类型的值
 let a: Object = 1;
 Void 类型,是typescript自己扩展的类型
 Void 类型,主要用来表示没有返回值的函数
 function a(): void {}
 Null 和 Undefined 类型
 顾名思义,表示一个变量专门用来表示 Null 或者 Undefined
 let a: undefined = undefined;
 let a: null = null;
 Never 类型
 用来表示报错的函数,或者死循环的函数
 function fn() :never { throw new Error("aaa"); }
 function fn (): never { while(true) {} }
 
- 
字面意思‘断言’,即人为决定类型,不需要typescript自动侦测
 两种语法
 尖括号语法,不推荐,此法react不支持
 let str: Object = "aaa";
 let strLength: number = (<string>someValue).length;
 as语法,推荐此语法,并且c#内部也推荐此语法
 let str: Object = 111;
 let num: Number = str as Number;
 
- 
duck typing是任何一门面相对象语言都有的类型验证方式,说简单点,就是一次验证多个变量
 宽松的duck typing,只要变量需要验证的参数存在于传递的参数里面即可
 对象写法
 function fn(obj: {a: string}) {}
 let obj = {a: "aa", b: 1};
 fn(obj);
 interface写法
 interface params {
 a: string
 }
 function fn(obj: params) {}
 let obj = {a: "aa", b: 1};
 fn(obj);
 可选的参数
 对象写法
 function fn(obj: {a?: string}) {}
 interface写法
 interface params {
 a?: string
 }
 function fn(obj: params) {}
 只读的参数
 对象写法
 {readonly a: string}
 interface写法
 interface params {
 readonly a: string
 }
 严格的duck typing,传递的参数和验证的参数必须完全一致
 interface params {
 a: string
 }
 function fn(obj: params) {}
 fn({a: "aa"});
 这种模式下可选参数已经失去了意义,为了挽救可选参数,解决方法有如下两种
 as语法
 interface params {
 a?: string,
 b?: number
 }
 function fn (obj: params): void {}
 fn({b: 11, c: "bb"} as params);
 索引签名
 interface params {
 a?: string,
 b?: number,
 [propName: string]: any
 }
 function fn (obj: params): void {}
 fn({b: 11, c: "bb", d: true});
 
- 
函数的验证使用接口来实现会更加的简洁
 interface myFn {
 (a: string, b: number): void
 }
 let fn: myFn = function(name, age){};
 fn("aa", 11);
 在定义函数时,函数的参数可以写类型也可以不写,并且参数的名称和接口的参数名称不需要相同
 注意:在javascript中,函数其实就是一个对象,所以函数的验证可以存在即是对象又是函数的情况,如下
 interface Test {
 (a: string): string;
 b: number;
 }
 function Fn() : Test {
 let fn = function(a: string){return a} as Test;
 fn.b = 111;
 return fn;
 }
 函数验证的其他写法
 let fn: (a: number) => void = function(x: number): void { }
 let fn = function(x: number): void { }
 let fn: (a: number) => void = function(x){ }
 let fn: (a?: number) => void = function(x){ } 可选参数
 function fn(a: string | number){ } 多种参数类型
 
- 
只要可以通过索引访问成员的数据类型,在typescript中都可以使用索引验证
 众所周知,索引可以是字符串和数值,但是在js中,数值的索引等价于字符串的索引,
 也就是说在typescript中,将索引指定为数值类型等价于字符串类型
 interface Entries {
 [index: number]: number;
 }
 let arr: Entries = [1, 2, 3];
 同样还支持只读的索引
 interface ReadonlyStringArray {
 readonly [index: number]: string;
 }
 
- 
用接口验证类只能验证类的实例属性,构造函数这类的非实例属性无法验证
 interface Test {
 a: string;
 fn(b: number): void;
 }
 class Demo extends React.Component implements Test {
 a: "aa"
 fn = (b: number) => { }
 }
 typescript对es6的类做了进一步的扩展,使其支持访问修饰符,抽象类抽象方法
 访问修饰符
 Public 默认,公开成员
 private 只能在类内部访问
 protected 本类内部和子类内部可以使用
 Readonly 只读属性
 static 静态属性
 抽象类,作用和接口类似,主要用来给其他类提供公共成员
 抽象类无法实例化,抽象方法只能提供定义,在子类中必须实现
 abstract class Demo {
 a: string;
 fn():void { console.log("aa"); }
 constructor(a: string) {this.a = a};
 abstract Fn(): void;
 }
 class Test extends Demo {
 constructor(){
 super("aaaaaa");
 }
 Fn():void {
 console.log("bbb");
 }
 }
 
- 
接口可以继承其他接口
 interface Test1 {
 a: string;
 }
 interface Test2 {
 b: string;
 }
 interface Test3 extends Test1, Test2 { }
 接口继承其他类
 class Demo {
 public a: string;
 private b: number;
 protected c: string;
 }
 interface Test extends Demo {}
 class Demo1 extends Demo implements Test{
 public a: "aa";
 }
 注意,由于接口继承类,接口可以继承类的private和protected成员,所以子类继承此接口要同时继承父类才行
 
- 
泛型也是一个非常简单的东西,就是类型参数
 泛型函数
 function fn<T>(params: T): T {
 return params;
 }
 fn<string>('aa'); 显示调用
 fn('aa'); 隐式调用
 完整写法
 let fn: <T>(params: T) => T = function<T>(params: T): T {
 return params;
 };
 泛型接口
 不提取参数
 interface Itf {
 <T>(params: T): T;
 }
 let fn: Itf = function<T>(params: T): T {
 return params;
 };
 提取参数
 interface Itf<T> {
 <T>(params: T): T;
 }
 let fn: Itf<string> = function<T>(params: T): T {
 return params;
 };
 泛型类
 class Demo<T>{
 fn: (a: T) => T;
 }
 泛型约束
 没有泛型约束,泛型将毫无用处,泛型参数默认是个白板儿,啥都没有
 一般写法
 interface Demo {
 length: number;
 }
 function fn<T extends Demo>(str: T): T {
 window.console.log(str.length);
 return str;
 }
 fn('aa');
 相互约束
 function fn<T, K extends keyof T>(obj: T, key: K) {
 window.console.log(obj[key]);
 return obj[key];
 }
 fn({a: 1}, 'a');
 验证类的构造函数
 class Test {
 constructor(){}
 }
 function fn<T>(obj: {new(): T}): T{
 return new obj();
 }
 fn(Test);
 
- 
很多基于npm的第三方包,都没有使用typescript,那么在ts中想使用这些安装包,需要遵从如下操作
 第一,在项目中新建一个.d.ts文件,如 third.d.ts
 第二,在文件中定义模块,如
 declare module "url" { // 此模块名必须和第三方包的名字一样
 export interface Url {
 protocol?: string;
 hostname?: string;
 pathname?: string;
 }
 export function parse(urlStr: string, parseQueryString?, slashesDenoteHost?): Url;
 }
 declare module "path" {
 export function normalize(p: string): string;
 export function join(...paths: any[]): string;
 export var sep: string;
 }
 declare module "hot-new-module"; 不想写声明可以不写
 第三,在需要使用第三方包的文件中导入模块
 /// <reference path="third.d.ts"/> 导入.d.ts声明文件
 import * as URL from "url"; 导入模块
 let myUrl = URL.parse("http://www.typescriptlang.org");
 
- 
命名空间和js的对象一样,单纯的为了避免命名冲突
 namespace Demo {
 export let a = 'aa';
 }
 window.console.log(Demo.a);
 
- 
使用React typings注入
 interface Props {
 a: string;
 }
 class App extends React.Component<Props, {}> {
 render() {
 return (
 <div className="App">
 {this.props.a}
 </div>
 );
 }
 }
 使用此组件
 <App a="aa"/>
 
typescript相关知识点总结的更多相关文章
- UITableView相关知识点
		//*****UITableView相关知识点*****// 1 #import "ViewController.h" // step1 要实现UITableViewDataSou ... 
- Android开发涉及有点概念&相关知识点(待写)
		前言,承接之前的 IOS开发涉及有点概念&相关知识点,这次归纳的是Android开发相关,好废话不说了.. 先声明下,Android开发涉及概念比IOS杂很多,可能有很多都题不到的.. 首先由 ... 
- IOS开发涉及有点概念&相关知识点
		前言,IOS是基于UNIX的,用C/C+/OC直通系统底层,不想android有个jvm. 首先还是系统架构的分层架构 1.核心操作系统层 Core OS,就是内存管理.文件系统.电源管理等 2.核心 ... 
- IOS之UI--小实例项目--添加商品和商品名(使用xib文件终结版) +  xib相关知识点总结
		添加商品和商品名小项目(使用xib文件终结版) 小贴士:博文末尾有项目源码在百度云备份的下载链接. xib相关知识点总结 01-基本使用 一开始使用xib的时候,如果要使用自定义view的代码,就需要 ... 
- 学习记录013-NFS相关知识点
		一.NFS相关知识点 1.NFS常用的路径/etc/exports NFS服务主配置文件,配置NFS具体共享服务的地点/usr/sbin/exportfs NFS服务的管理命令,exportfs -a ... 
- TCP/IP 相关知识点与面试题集
		第一部分:TCP/IP相关知识点 对TCP/IP的整体认 链路层知识点 IP层知识点 运输层知识点 应用层知识点 (这些知识点都可以参考:http://www.cnblogs.com/newwy/p/ ... 
- Python开发一个csv比较功能相关知识点汇总及demo
		Python 2.7 csv.reader(csvfile, dialect='excel', **fmtparams)的一个坑:csvfile被csv.reader生成的iterator,在遍历每二 ... 
- Caffe学习系列(二)Caffe代码结构梳理,及相关知识点归纳
		前言: 通过检索论文.书籍.博客,继续学习Caffe,千里之行始于足下,继续努力.将自己学到的一些东西记录下来,方便日后的整理. 正文: 1.代码结构梳理 在终端下运行如下命令,可以查看caffe代码 ... 
- php正则相关知识点
		关于正则,其实简单就是搜索和匹配.php,java,python等都是支持正则的,php正则兼容perl.好多同学觉得正则比较难,比较抽象,其实正则是非常简单的,主要是一个熟悉和反复练习的结果,还有一 ... 
随机推荐
- 基于Spring mvc 的Websocket 开发
			1.Pom.xml <dependency> <groupId>org.springframework</groupId> <artifactId>sp ... 
- 织梦dedecms 自带采集的缩略图地址后面有“/”斜杠的解决方法
			本来想偷懒在网上找一些文档去解决织梦采集缩略图地址带“/”的问题的,可是找了找发现没有人写出解决方法,只好自己动手了. 过程很复杂,找了问题的原因也是找了半天,自己一点一点的测试.最后找到了问题所在. ... 
- iOS APP AppIcon& LaunchImage
			AppIcon size for iPhone: 29 - Settings @1x 29*29, 58 - Settings @2x 58*58, 87 - Settings @3x 87*87 ... 
- spark学习4(zookeeper3.4集群搭建)
			第一步:zookeeper安装 通过WinSCP软件将zookeeper-3.4.8.tar.gz软件传送到/usr/zookeeper/目录下 [root@spark1 zookeeper]# ch ... 
- mapreduce实现学生平均成绩
			思路: 首先从文本读入一行数据,按空格对字符串进行切割,切割后包含学生姓名和某一科的成绩,map输出key->学生姓名 value->某一个成绩 然后在reduce里面对成绩进行遍历 ... 
- Tomcat学习之Wrapper
			Tomcat学习之Wrapper 分类: WEB服务器2012-08-30 22:16 1547人阅读 评论(0) 收藏 举报 tomcatservletwrapperservletslistexce ... 
- Codeforces Round #200 (Div. 1) BCD
			为了锻炼个人能力奋力div1 为了不做原题从200开始 B 两个电线缠在一起了 能不能抓住两头一扯就给扯分开 很明显当len为odd的时候无解 当len为偶数的时候 可以任选一段长度为even的相同字 ... 
- tortoisegit推送ssh-key需要输入用户信息
			修改了测试代码,却在提交代码时候又跳出来请输入用户名和密码, 后来发现,github push有两种方式,ssh方式和https方式.而https方式是不同的,具体来说,就是url信息的不同,实际的验 ... 
- java开发环境的搭建(JDK的下载安装及环境变量的配置)
			首先可以在Sun公司网站 http://java.sun.com 免费下载java se提供的JDK. 下载后再下载的文件夹下打开,双击jdk文件跟着提示进行安装,安装结束后——点击本机电脑的开始—— ... 
- leetcode 645. Set Mismatch——凡是要节约空间的题目 都在输入数据上下功夫 不要担心破坏原始的input
			The set S originally contains numbers from 1 to n. But unfortunately, due to the data error, one of ... 
