黑马程序员技术交流社区

标题: 【广州前端首发】TypeScript核心课程笔记(四) [打印本页]

作者: AreYouGlad    时间: 2017-12-15 16:37
标题: 【广州前端首发】TypeScript核心课程笔记(四)
本帖最后由 AreYouGlad 于 2017-12-20 11:53 编辑

查看更多精彩前端资源


接口

作用
语法与特性
[AppleScript] 纯文本查看 复制代码
interface Person {
        name: string;
        age: number;
        gender: string = '男';              // 报错, 接口里的属性不能赋值
        say(): void;
        study(): void;
        run(): void{ console.log('跑') }  // 报错, 接口里的方法不能实现
}

使用范例

用接口约束类
[AppleScript] 纯文本查看 复制代码
// 使用接口定义Person类应该有的属性与方法
interface PersonInterface {
  name: string;
  age: number;
  eat(food: string): void;
}

// 当真正编写Person类时, 使用implements关联对应的接口, 以约束我们的实现
class CNPerson implements PersonInterface {

                // 如果不添加name或age就会报错, 多添加不会报错
    constructor(public name: string, public age: number, public gender: string) {}

    // 不实现这个方法就会报错
    eat(food: string): void {
            console.log('我要吃${food}');
    }

    // 多实现不会报错
    say(): void {
            console.log(`我是${this.name}`);
    }
}

用接口约束字面量对象
[AppleScript] 纯文本查看 复制代码
interface data {
        a: number,
        b: string
};

let obj: data = { a: 10, b: 'abc' };         // 正常, 这个对象符合接口data定义的数据结构
let obj2: data = { a: 10 };                    // 报错, 缺失b属性
let obj3: data = { a: 10, b: true };        // 报错, b属性类型不对
let obj4: data = { a: 10, b: true, c:1 };  // 报错, 多了c属性
泛型

为什么要泛型
[AppleScript] 纯文本查看 复制代码
function createArray(...arg: number[]): number[] {
        return arg;
}

[AppleScript] 纯文本查看 复制代码
function createArray(...arg: any[]): any[] {
        return arg;
}

使用泛型
[AppleScript] 纯文本查看 复制代码
function createArray<Type>(...arg: Type[]): Type[] {
        return arg;
}

let arr1: Array<number> = createArray<number>(10, 20, 30);    // 正确
let arr2: Array<string> = createArray<string>('a', 'b', 'c')            // 正确
let arr3: Array<any> = createArray<string>('a', 'b', 10)               // 报错

泛型在类中的应用
[AppleScript] 纯文本查看 复制代码
class Cache {

    private data = {};

    set(key: string, val: any) {
        this.data[key] = val;
    }

    get(key: string): any {
        return this.data[key];
    }
}

let c: Cache = new Cache();
c.set('小红', 10);
c.get('小红');

[AppleScript] 纯文本查看 复制代码
class CacheNumber {

    private data = {};

    set(key: string, val: number) {
        this.data[key] = val;
    }

    get(key: string): number {
        return this.data[key];
    }
}

class CacheString {

    private data = {};

    set(key: string, val: string) {
        this.data[key] = val;
    }

    get(key: string): string {
        return this.data[key];
    }
}

[AppleScript] 纯文本查看 复制代码
class Cache<Type> {

    private data = {};

    set(key: string, val: Type) {
        this.data[key] = val;
    }

    get(key: string): Type {
        return this.data[key];
    }
}

let c = new Cache<string>();
c.set('小红', 10);     // 报错, val必须为字符串
c.set('小红', '10');    // 正常

// 如果变量在定义便赋了值, 那么ts会自动推导变量的类型
// 如果要手动写类型的话, 必须声明一致的泛型类型, 看下面例子
let c2: Cache = new Cache<number>();                     // 报错
let c3: Cache<string> = new Cache<number>();       // 报错
let c3: Cache<number> = new Cache<number>();    // 正常

使用泛型定义数组
之前我们在定义数组类型时是这样写的
[AppleScript] 纯文本查看 复制代码
let arr: number[] = [];
arr.push(10);        // 正常
arr.push('abx');    // 报错

学习了泛型之后还可以这样写
[AppleScript] 纯文本查看 复制代码
let arr: Array<number> = [];
arr.push(10);        // 正常
arr.push('abx');    // 报错



作者: AreYouGlad    时间: 2017-12-15 16:37

作者: hz有盼头啊    时间: 2017-12-17 07:45
感谢分享





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2