本文讲解typescript语法

由于js语法本身的混乱,再加上目前框架的割据,导致typescript用起来没有一致性,本文尽量总结实际开发中可能会用到的知识点

目录

数据类型

类型断言

duck typing

函数类型的验证

索引验证

类验证

接口扩展

泛型

与第三方库一起使用

命名空间

react组件属性验证


  1. 数据类型

    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) {} }
  2. 类型断言

    字面意思‘断言’,即人为决定类型,不需要typescript自动侦测
    两种语法
    尖括号语法,不推荐,此法react不支持
    let str: Object = "aaa";
    let strLength: number = (<string>someValue).length;
    as语法,推荐此语法,并且c#内部也推荐此语法
    let str: Object = 111;
    let num: Number = str as Number;
  3. duck typing

    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});
  4. 函数类型的验证

    函数的验证使用接口来实现会更加的简洁
    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){ } 多种参数类型
  5. 索引验证

    只要可以通过索引访问成员的数据类型,在typescript中都可以使用索引验证
    众所周知,索引可以是字符串和数值,但是在js中,数值的索引等价于字符串的索引,
    也就是说在typescript中,将索引指定为数值类型等价于字符串类型
    interface Entries {
    [index: number]: number;
    }
    let arr: Entries = [1, 2, 3];
    同样还支持只读的索引
    interface ReadonlyStringArray {
    readonly [index: number]: string;
    }
  6. 类验证

    用接口验证类只能验证类的实例属性,构造函数这类的非实例属性无法验证
    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");
    }
    }
  7. 接口扩展

    接口可以继承其他接口
    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成员,所以子类继承此接口要同时继承父类才行
  8. 泛型

    泛型也是一个非常简单的东西,就是类型参数
    泛型函数
    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);
  9. 与第三方库一起使用

    很多基于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");
  10. 命名空间

    命名空间和js的对象一样,单纯的为了避免命名冲突
    namespace Demo {
    export let a = 'aa';
    }
    window.console.log(Demo.a);
  11. react组件属性验证

    使用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相关知识点总结的更多相关文章

  1. UITableView相关知识点

    //*****UITableView相关知识点*****// 1 #import "ViewController.h" // step1 要实现UITableViewDataSou ...

  2. Android开发涉及有点概念&相关知识点(待写)

    前言,承接之前的 IOS开发涉及有点概念&相关知识点,这次归纳的是Android开发相关,好废话不说了.. 先声明下,Android开发涉及概念比IOS杂很多,可能有很多都题不到的.. 首先由 ...

  3. IOS开发涉及有点概念&相关知识点

    前言,IOS是基于UNIX的,用C/C+/OC直通系统底层,不想android有个jvm. 首先还是系统架构的分层架构 1.核心操作系统层 Core OS,就是内存管理.文件系统.电源管理等 2.核心 ...

  4. IOS之UI--小实例项目--添加商品和商品名(使用xib文件终结版) + xib相关知识点总结

    添加商品和商品名小项目(使用xib文件终结版) 小贴士:博文末尾有项目源码在百度云备份的下载链接. xib相关知识点总结 01-基本使用 一开始使用xib的时候,如果要使用自定义view的代码,就需要 ...

  5. 学习记录013-NFS相关知识点

    一.NFS相关知识点 1.NFS常用的路径/etc/exports NFS服务主配置文件,配置NFS具体共享服务的地点/usr/sbin/exportfs NFS服务的管理命令,exportfs -a ...

  6. TCP/IP 相关知识点与面试题集

    第一部分:TCP/IP相关知识点 对TCP/IP的整体认 链路层知识点 IP层知识点 运输层知识点 应用层知识点 (这些知识点都可以参考:http://www.cnblogs.com/newwy/p/ ...

  7. Python开发一个csv比较功能相关知识点汇总及demo

    Python 2.7 csv.reader(csvfile, dialect='excel', **fmtparams)的一个坑:csvfile被csv.reader生成的iterator,在遍历每二 ...

  8. Caffe学习系列(二)Caffe代码结构梳理,及相关知识点归纳

    前言: 通过检索论文.书籍.博客,继续学习Caffe,千里之行始于足下,继续努力.将自己学到的一些东西记录下来,方便日后的整理. 正文: 1.代码结构梳理 在终端下运行如下命令,可以查看caffe代码 ...

  9. php正则相关知识点

    关于正则,其实简单就是搜索和匹配.php,java,python等都是支持正则的,php正则兼容perl.好多同学觉得正则比较难,比较抽象,其实正则是非常简单的,主要是一个熟悉和反复练习的结果,还有一 ...

随机推荐

  1. mongodb,redis简单学习

     2.mongodb安装配置简单学习                   配置好数据库路径就可以mongo命令执行交互操作了:先将服务器开起来:在开个cmd执行交互操作                 ...

  2. 从Shell眼中看世界【TLCL】

    字符展开: echo * 路径名展开: echo D* 隐藏文件路径名展开   ls -d .[!.]?* 波浪线展开: echo ~ 算术表达式展开: $((expression)) 花括号展开: ...

  3. numpy random 生成随机矩阵

    import numpy as np np.random.rand(a, b): >>> np.random.rand(4,3) array([[ 0.06679473, 0.710 ...

  4. Android当下最流行的开源框架总结

    Android中能够简化开发流程的一些框架 本文介绍的是一些博主在开发过程中经常用到的Android开源框架,所谓开源框架我的理解就是别人封装好的代码,可以直接拿过来使用,并且源码也全部公开的代码库. ...

  5. js的深拷贝特别注意this的深拷贝

    原生的,jquery的extend,和angular的copy 我们深拷贝的根本原因是为了不改变原来对象的值. <script type="text/javascript"& ...

  6. QT5 QtreeWidget 实现点击item事件以及右键菜单删除item 和 重命名item

    1.new 一个QTreeWidget 对象,并设置头标签,和根节点(个人程序需要) QTreeWidget* treeWidget = ui.treeWidget;//我已经在ui设计师中拖了一个Q ...

  7. Win10 14316 bash

    更新 WSL ~~~ 现在添加删除组件中勾选 Windows Subsystem for Linux 然后运行bash,会提示一个链接,浏览器打开后会出现App Store安装Ubuntu 再次运行b ...

  8. 插入排序—希尔排序(Shell`s Sort)原理以及Java实现

    希尔排序是1959 年由D.L.Shell 提出来的,相对直接排序有较大的改进.希尔排序又叫缩小增量排序 基本思想: 先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录 ...

  9. iOS 检查指定日期是否在当前日期之前

    iOS检查指定日期是否在当前日期之前, 直接上代码: - (BOOL)checkProductDate: (NSString *)tempDate { NSDateFormatter *dateFor ...

  10. GUID在.net里的使用

    GUID(全局统一标识符)是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的.通常平台会提供生成GUID的API.生成算法很有意思,用到了以太网卡地址.纳秒级时间.芯片ID码和许多可 ...