简单的typeScript (一)

117 阅读3分钟

复习typescrript,从入门开始。

类型

一、原始类型

原始数据类型包括:布尔值、数值、字符串、null、undefined 以及 ES6 中的新类型 Symbol

  • 布尔值 (boolean)
let isDone: boolean = false;
  • 数值 (number)
let decLiteral: number = 6; 
let hexLiteral: number = 0xf00d; // ES6 中的二进制表示法 
let binaryLiteral: number = 0b1010; // ES6 中的八进制表示法 
let octalLiteral: number = 0o744;
  • 字符串 (string)
let myName: string = 'Tom'; 
let myAge: number = 25;
  • 空值 (null | undefined) (void)

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

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

null和undefined

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

任意值 any

如果是一个普通类型,在赋值过程中改变类型是不被允许的,但如果是 any 类型,则允许被赋值为任意类型。

let myFavoriteNumber: any = 'seven'; 
myFavoriteNumber = 7;

联合类型

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

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

let myFavoriteNumber: string | number; 
myFavoriteNumber = 'seven'; 
myFavoriteNumber = 7; 
let myFavoriteNumber: string | number; 
myFavoriteNumber = true;

对象的类型 --接口

在面向对象语言中,接口(Interfaces)是一个很重要的概念,它是对行为的抽象,而具体如何行动需要由类(classes)去实现(implement)。

TypeScript 中的接口是一个非常灵活的概念,除了可用于对类的一部分行为进行抽象以外,也常用于对「对象的形状(Shape)」进行描述。

interface Person { 
    name: string; 
    age: number; 
} 
let tom: Person = {
    name: 'Tom', 
    age: 25 
};

可选属性

有时我们希望不要完全匹配一个形状,那么可以用可选属性

interface Person { 
    name: string;
    age?: number; 
} 
let tom: Person = { 
    name: 'Tom' 
}; 
interface Person { 
    name: string;
    age?: number;
} 
let tom: Person = { 
    name: 'Tom',
    age: 25 
};

任意属性

一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集

interface Person { 
    name: string; 
    age?: number;
    [propName: string]: any;
} 
let tom: Person = { 
    name: 'Tom', 
    gender: 'male' 
};

只读属性 readonly (注意,只读的约束存在于第一次给对象赋值的时候,而不是第一次给只读属性赋值的时候

interface Person { 
    readonly id: number; 
    name: string; 
    age?: number; 
    [propName: string]: any; 
} 
let tom: Person = { 
    id: 89757,
    name: 'Tom', 
    gender: 'male' 
};

数组的类型

  • 「类型 + 方括号」来表示数组

    let fibonacci: number[] = [1, 1, 2, 3, 5];
    
  • 数组泛型 (我们也可以使用数组泛型(Array Generic) Array 来表示数组)

    let fibonacci: Array = [1, 1, 2, 3, 5];
    
  • 接口表示数组

    interface NumberArray {
        [index: number]: number; 
    } 
    let fibonacci: NumberArray = [1, 1, 2, 3, 5]; 
    //NumberArray 表示:只要索引的类型是数字时,那么值的类型必须是数字。
    
  • 类数组

    事实上常用的类数组都有自己的接口定义,如 IArguments, NodeList, HTMLCollection 等:

    function sum() { 
       let args: { 
       [index: number]: number; 
       length: number; 
       callee: Function; 
       } = arguments;
    }
    

    其中 IArguments 是 TypeScript 中定义好了的类型,它实际上就是:

    interface IArguments { 
        [index: number]: any; 
        length: number; 
        callee: Function;
    }
    

    关于内置对象,可以参考内置对象一章。

    • any在数组中的应用
    let list: any[] = ['xcatliu', 25, { website: 'http://xcatliu.com' }];
    

函数的类型

  • 函数声名

    function sum(x: number, y: number): number { return x + y; }
    
  • 函数表达式

    let mySum = function (x: number, y: number): number { return x + y; };
    
  • 接口定义函数的形状

    interface SearchFunc { 
        (source: string, subString: string): boolean;
    } 
    let mySearch: SearchFunc;
    mySearch = function(source: string, subString: string) { 
        return source.search(subString) !== -1; 
    }
    

    可选参数 (可选参数后面不允许再出现必需参数了

    function buildName(firstName: string, lastName?: string) { 
        if (lastName) {
            return firstName + ' ' + lastName; 
        } else { 
            return firstName; 
        } 
    } 
    let tomcat = buildName('Tom', 'Cat'); 
    let tom = buildName('Tom');
    

    默认参数

    function buildName(firstName: string, lastName: string = 'Cat') { 
        return firstName + ' ' + lastName; 
    } 
    let tomcat = buildName('Tom', 'Cat'); 
    let tom = buildName('Tom');
    

    剩余参数

    function push(array: any[], ...items: any[]) { 
        items.forEach(function(item) { 
            array.push(item); 
        }); 
    } 
    let a = [];
    push(a, 1, 2, 3);