zoukankan      html  css  js  c++  java
  • TypeScript学习笔记—数据类型

    TypeScript 数据类型

    Boolean 类型

    let isDone: boolean = false; // tsc => var isDone = false;

    Number 类型

    let count: number = 10; // tsc => var count = 10

    String 类型

    let name: string = 'Semliker'; // tsc => var name = 'Semlinker'

    Array 类型

    let list: number[] = [1,2,3]; // tsc => var list = [1,2,3];   
    
    let list: Array<number> = [1,2,3]; 
    // tsc => var list = [1,2,3];

    Enum 类型

    enum Direction {
        NORTH,
        SOUTH,
        EAST,
        WEST
    }; 
    
    let dir: Direction = Direction.NORTH; 

    Any (动态类型)

    let notSure: any = 4;
    notSure = "maybe a string instead";
    notSure = false; 
    
    => tsc =>  
    
    var notSure = 4;
    notSure = "maybe a string instead";
    notSure = false;

    空值

    JavaScript 没有空值(Void)的概念,在 TypeScirpt 中,可以用 void 表示没有任何返回值的函数:

    function alertName(): void {
        alert('My name is Tom');
    }

    声明一个 void 类型的变量没有什么用,因为你只能将它赋值为 undefined 和 null

    let unusable: void = undefined;

    Null 和 Undefined

    在 TypeScript 中,可以使用 null 和 undefined 来定义这两个原始数据类型:

    let u: undefined = undefined;
    let n: null = null;

    undefined 类型的变量只能被赋值为 undefinednull 类型的变量只能被赋值为 null

    与 void 的区别是,undefined 和 null 是所有类型的子类型。也就是说 undefined 类型的变量,可以赋值给 number 类型的变量:

    // 这样不会报错
    let num: number = undefined;
    // 这样也不会报错
    let u: undefined;
    let num: number = u;

    而 void 类型的变量不能赋值给 number 类型的变量:

    let u: void;
    let num: number = u;
    
    // index.ts(2,5): error TS2322: Type 'void' is not assignable to type 'number'.

    类型推论

    以下代码虽然没有指定类型,但是会在编译的时候报错:

    let myFavoriteNumber = 'seven';
    myFavoriteNumber = 7;
    
    // index.ts(2,1): error TS2322: Type 'number' is not assignable to type 'string'.

    事实上,它等价于:

    let myFavoriteNumber: string = 'seven';
    myFavoriteNumber = 7;
    
    // index.ts(2,1): error TS2322: Type 'number' is not assignable to type 'string'.

    TypeScript 会在没有明确的指定类型的时候推测出一个类型,这就是类型推论。

    如果定义的时候没有赋值,不管之后有没有赋值,都会被推断成 any 类型而完全不被类型检查:

    let myFavoriteNumber;
    myFavoriteNumber = 'seven';
    myFavoriteNumber = 7;

    联合类型

    联合类型(Union Types)表示取值可以为多种类型中的一种。

    let myFavoriteNumber: string | number;
    myFavoriteNumber = 'seven';
    myFavoriteNumber = 7;
    let myFavoriteNumber: string | number;
    myFavoriteNumber = true;
    
    // index.ts(2,1): error TS2322: Type 'boolean' is not assignable to type 'string | number'.
    //   Type 'boolean' is not assignable to type 'number'.

    联合类型使用 | 分隔每个类型。

    这里的 let myFavoriteNumber: string | number 的含义是,允许 myFavoriteNumber 的类型是 string 或者 number,但是不能是其他类型。

    当 TypeScript 不确定一个联合类型的变量到底是哪个类型的时候,我们只能访问此联合类型的所有类型里共有的属性或方法:

    function getLength(something: string | number): number {
        return something.length;
    }
    
    // index.ts(2,22): error TS2339: Property 'length' does not exist on type 'string | number'.
    //   Property 'length' does not exist on type 'number'.

    上例中,length 不是 string 和 number 的共有属性,所以会报错。

    访问 string 和 number 的共有属性是没问题的:

    function getString(something: string | number): string {
        return something.toString();
    }

    联合类型的变量在被赋值的时候,会根据类型推论的规则推断出一个类型:

    let myFavoriteNumber: string | number;
    myFavoriteNumber = 'seven';
    console.log(myFavoriteNumber.length); // 5
    myFavoriteNumber = 7;
    console.log(myFavoriteNumber.length); // 编译时报错
    
    // index.ts(5,30): error TS2339: Property 'length' does not exist on type 'number'.

    上例中,第二行的 myFavoriteNumber 被推断成了 string,访问它的 length 属性不会报错。

    而第四行的 myFavoriteNumber 被推断成了 number,访问它的 length 属性时就报错了。

    参考:

    TypeScript 入门教程

    TypeScript 简介

     

  • 相关阅读:
    Firemonkey 控件设定字型属性及颜色
    ListView 使用 LiveBindings 显示超过 200 条记录
    Firemonkey ListView 获取项目右方「>」(Accessory) 事件
    XE7 Update 1 选 iOS 8.1 SDK 发布 iPhone 3GS 实机测试
    Firemonkey Bitmap 设定像素颜色 Pixel
    Firemonkey 移动平台 Form 显示使用 ShowModal 范例
    XE7 提交 App(iOS 8)提示「does not contain the correct beta entitlement」问题修复
    XE7 Android 中使用 MessageDlg 范例
    导出 XE6 预设 Android Style (*.style) 档案
    修正 Memo 設定為 ReadOnly 後, 無法有複製的功能
  • 原文地址:https://www.cnblogs.com/Jason-Xiang/p/8967984.html
Copyright © 2011-2022 走看看