typescript如此简单,看一眼就会

999 阅读5分钟

特点 '''JavaScript 的超集

'''增加了静态类型系统 静态类型:编译的时候就知道每一个变量的类型,因为类型错误而不能做的事情是语法错误 (能做到运行前错误检查,故语言本身就能提供类型报错、代码提示、自动补全等功能,IDE也能提供各类服务,比如智能的rename、快捷进入相应类内部阅读代码等) 动态类型:编译的时候不知道每一个变量的类型,运行时进行类型检查和绑定,因为类型错误而不能做的事情是运行时错误。

        强类型:不容忍隐式类型转换。比如python
             "1"+2
             Traceback (most recent call last):
                File "<stdin>", line 1, in <module>
            TypeError: cannot concatenate 'str' and 'int' objects

        弱类型:容忍隐式类型转换。比如js
            1+'a'='1a'


        弱类型、静态类型 : C/C++
        弱类型、动态类型: JS/VB/Perl/PHP
        强类型、静态类型 :Java/C#
        强类型、动态类型 :Python, Scheme
        静态显式类型 :Java/C
        静态隐式类型 :Ocaml, Haskell

'''为大型软件开发而设计的

    TypeScript 增加了代码的可读性和可维护性
       类型系统实际上是最好的文档,大部分的函数看看类型的定义就可以知道如何使用了
       可以在编译阶段就发现大部分错误,这总比在运行时候出错好
       增强了编辑器和 IDE 的功能,包括代码补全、接口提示、跳转到定义、重构等
    
    TypeScript 非常包容
        TypeScript 是 JavaScript 的超集,.js 文件可以直接重命名为 .ts 即可
        即使不显式的定义类型,也能够自动做出类型推论
        可以定义从简单到复杂的几乎一切类型
        即使 TypeScript 编译报错,也可以生成 JavaScript 文件
        兼容第三方库,即使第三方库不是用 TypeScript 写的,也可以编写单独的类型文件供 TypeScript 读取

    TypeScript 拥有活跃的社区
        大部分第三方库都有提供给 TypeScript 的类型定义文件
        Google 开发的 Angular2 就是使用 TypeScript 编写的
        TypeScript 拥抱了 ES6 规范

    TypeScript 的缺点
        有一定的学习成本,需要理解接口(Interfaces)、泛型(Generics)、类(Classes)、枚举类型(Enums)等前端工程师可能不是很熟悉的概念
        短期可能会增加一些开发成本,毕竟要多写一些类型的定义,不过对于一个需要长期维护的项目,TypeScript 能够减少其维护成本
        集成到构建流程需要一些工作量
        可能和一些库结合的不是很完美

'''最终编译产生 JavaScript

    变量声明
      支持let和const;

    基础类型
        
        布尔值
        let isDone: boolean = false;

        数字
        let decLiteral: number = 6;
        
        字符串
        let name: string = "bob";


        默认情况下null和undefined是所有类型的子类型。 就是说你可以把 null和undefined赋值给number类型的变量。

        undefined
        let u: undefined = undefined;

        Null 
        let n: null = null;

        数组
        let list: number[] = [1, 2, 3];
        
        数组泛型
        let list: Array<number> = [1, 2, 3];
        

        元组
            let x: [string, number];
                x = ['hello', 10]  编译成功
                x = [10, 'hello']  编译失败
            
                当访问一个已知索引的元素,会得到正确的类型
                x[0].substr(1) 编译成功
                x[1].substr(1) 编译失败
            
                当访问一个越界的元素,会使用联合类型替代:

                x[3] = 'world'; 编译成功 字符串可以赋值给(string | number)类型
                x[5].toString() 编译成功
                x[6] = true; 编译失败  布尔不是(string | number)类型

        枚举
            enum类型是对JavaScript标准数据类型的一个补充
            
            默认情况下,从0开始为元素编号。 
            enum Color {Red, Green, Blue}
            let c: Color = Color.Green;
            console.log(c)    // 1

            你也可以手动的指定成员的数值。
            enum Color {Red = 1, Green = 2, Blue = 4}
            let c: Color = Color.Green;
            console.log(c)   // 2

            如果只设置了1个,其他都是按顺序给元素编号
            enum Color {Red = 8, Green, Blue}
            let c: Color = Color.Green;
            console.log(c)   // 9
            
            枚举类型提供的一个便利是你可以由枚举的值得到它的名字
            enum Color {Red = 1, Green, Blue}
            let c: string = Color[2]; 
            console.log(c) //Green

        Any
            有时候,我们会想要为那些在编程阶段还不清楚类型的变量指定一个类型。 这些值可能来自于动态的内容,比如来自用户输入或第三方代码库。
            这种情况下,我们不希望类型检查器对这些值进行检查而是直接让它们通过编译阶段的检查。 
            那么我们可以使用 any类型来标记这些变量
                
            let notSure: any = 4; 

            在对现有代码进行改写的时候,any类型是十分有用的,它允许你在编译时可选择地包含或移除类型检查。
                notSure = "maybe a string instead"; 编译成功
                notSure = false;  编译成功
            
            当你只知道一部分数据的类型时,any类型也是有用的。 比如,你有一个数组,它包含了不同的类型的数据:

            let list: any[] = [1, true, "free"]; 编译成功
                list[1] = 100;  编译成功

        Void
            它表示没有任何类型。 当一个函数没有返回值时,就可以使用
                function warnUser(): void {
                    console.log("This is my warning message");
                }

            声明一个void类型的变量没有什么大用,因为你只能为它赋予undefined和null
            let unusable: void = undefined;

        Never 
            never类型表示的是那些永不存在的值的类型。
            
             // 返回never的函数必须存在无法达到的终点
            function error(message: string): never {
                throw new Error(message);
            }

            // 推断的返回值类型为never
            function fail() {
                return error("Something failed");
            }

            // 返回never的函数必须存在无法达到的终点
            function infiniteLoop(): never {
                while (true) {
                }
            }
        
        Object表示js里的对象

            declare function create(o: object | null): void;

            create({ prop: 0 }); // 编译成功
            create(null); // 编译成功

            create(42); // 编译失败
            create("string"); // 编译失败
            create(false); // 编译失败
            create(undefined); // 编译失败

        类型断言
            类型断言好比其它语言里的类型转换,但是不进行特殊的数据检查和解构。它没有运行时的影响,只是在编译阶段起作用。
        
            类型断言有两种形式。 其一是“尖括号”语法
            let someValue: any = "this is a string";     
            let strLength: number = (<string>someValue).length;

            另一个为as语法:
            let someValue: any = "this is a string";
            let strLength: number = (someValue as string).length;

            当在TypeScript里使用JSX时,只有 as语法断言是被允许的。