美文网首页
TypeScript一些笔记

TypeScript一些笔记

作者: CMPEAX | 来源:发表于2018-09-13 11:25 被阅读0次

    元组 Tuple

    元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同。 比如,你可以定义一对值分别为 string和number类型的元组。
    // Declare a tuple type
    let x: [string, number];
    // Initialize it
    x = [‘hello’, 10]; // OK
    // Initialize it incorrectly
    x = [10, ‘hello’]; // Error
    

    枚举

    enum Color {Red = 1, Green = 2, Blue = 4}
    
    let c: Color = Color.Green;
    

    作用域规则

    对于熟悉其它语言的人来说,var声明有些奇怪的作用域规则。 看下面的例子:
    复制到剪切板
    function f(shouldInitialize: boolean) {
        if (shouldInitialize) {
            var x = 10;
        }
    
        return x;
    }
    f(true);  // returns '10'
    f(false); // returns 'undefined'
    
    有些读者可能要多看几遍这个例子。 变量 x是定义在if语句里面,但是我们却可以在语句的外面访问它。 这是因为 var声明可以在包含它的函数,模块,命名空间或全局作用域内部任何位置被访问(我们后面会详细介绍),包含它的代码块对此没有什么影响。 有些人称此为* var作用域或函数作用域*。 函数参数也使用函数作用域。

    块作用域

    当用let声明一个变量,它使用的是词法作用域或块作用域。 不同于使用 var声明的变量那样可以在包含它们的函数外访问,块作用域变量在包含它们的块或for循环之外是不能访问的。

    属性重命名

    你也可以给属性以不同的名字:
    let { a: newName1, b: newName2 } = o;
    
    这里的语法开始变得混乱。 你可以将 a: newName1 读做 “a 作为 newName1“。 方向是从左到右,好像你写成了以下样子:
    let newName1 = o.a;
    let newName2 = o.b;
    
    令人困惑的是,这里的冒号不是指示类型的。 如果你想指定它的类型, 仍然需要在其后写上完整的模式。
    let {a, b}: {a: string, b: number} = o;
    
    那么,defaults里的food属性会重写food: "rich",在这里这并不是我们想要的结果。
    对象展开还有其它一些意想不到的限制。 首先,它仅包含对象 自身的可枚举属性。 大体上是说当你展开一个对象实例时,你会丢失其方法:
    class C {
      p = 12;
      m() {
      }
    }
    let c = new C();
    let clone = { ...c };
    clone.p; // ok
    clone.m(); // error!
    
    其次,TypeScript编译器不允许展开泛型函数上的类型参数。 这个特性会在TypeScript的未来版本中考虑实现。
    interface SquareConfig
    {
        color?: string;
        width?: number;
    }
    
    varname?:type ?:为可选属性预定义

    只读属性

    一些对象属性只能在对象刚刚创建的时候修改其值。 你可以在属性名前用 readonly来指定只读属性:
    interface Point {
        readonly x: number;
        readonly y: number;
    }
    
    你可以通过赋值一个对象字面量来构造一个Point。 赋值后, x和y再也不能被改变了。
    let p1: Point = { x: 10, y: 20 };
    p1.x = 5; // error!
    
    TypeScript具有ReadonlyArray<T>类型,它与Array<T>相似,只是把所有可变方法去掉了,因此可以确保数组创建后再也不能被修改:
    let a: number[] = [1, 2, 3, 4];
    let ro: ReadonlyArray<number> = a;
    ro[0] = 12; // error!
    ro.push(5); // error!
    ro.length = 100; // error!
    a = ro; // error!
    
    上面代码的最后一行,可以看到就算把整个ReadonlyArray赋值到一个普通数组也是不可以的。 但是你可以用类型断言重写:
    a = ro as number[];
    readonly vs const
    
    最简单判断该用readonly还是const的方法是看要把它做为变量使用还是做为一个属性。 做为变量使用的话用const,若做为属性则使用readonly。

    类型断言

    let mySquare = createSquare({ width: 100, opacity: 0.5 } as SquareConfig);
    

    相关文章

      网友评论

          本文标题:TypeScript一些笔记

          本文链接:https://www.haomeiwen.com/subject/vuhwgftx.html