在打字稿中创建通用接口

时间:2017-06-07 09:24:39

标签: typescript

abc中下面一行中的通用部分是<> 。

实际上,因为我在角度2中从Javascript端到Typescript端。

这就是为什么我没有在Javascript中看到这些通用部分。

export interface Animals<abc>

export class WaterAnimal <abc> implements Animals<abc> { }

我得到的东西:

  1. Generic Part有助于维护我们发送的类型,并且从任何函数实现的类型可以是类型可以是任何Object,String,Number或Array。
  2. 例如: -

    function identity<T>(arg: T): T {
        return arg;
    }
    

    我想问的事情: -

    1. 当我们进入类和接口时: - 通过传入参数 界面如动物界面的目的是什么。

    2. 如果有任何目的我还不知道,现在如果我们将动物接口实现为 WaterAnimal 类,那么我想写{ {1}} 动物接口前面,因为在定义接口时我将该事物作为参数传递给它。为什么编译器强迫我用 WaterAnimal <定义<abc> / strong> Class ..这背后有任何原因..

    3. 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

语言本身就存在一个很好的泛型例子。

大多数语言都有未打字列表上的表单,例如JavaScript数组:

var arr = [
    1,
    "str",
    new Customer()
];

但是一个更有用的对象是一个只包含单个类型的数组 - 因为那样你可以知道所有内容都是相同的迭代数组:

var arr: NumberArray = [
    1,
    3,
    5
];

但我们需要为每种数组创建一个新类型,因此我们最终会得到NumberArrayStringArrayCustomerArray等等。

因此,我们不是创建几乎无限数量的类型,而是创建一个通用类型。然后我们指定我们打算使用的类型:

var arr: Array<number>= [
    1,
    3,
    5
];

类型参数(number)允许我们重用Array类或接口,而不是创建新类型。这个条件是除非我们指定一个类型约束,否则Array不能知道这个类型。

要理解如何在泛型类中使用它,这是一个快速的假例子:

class ArrayOfOne<T> {
    private item: T;

    add(item: T) {
        this.item = item;
    }

    retrieve() : T {
        return this.item;
    }
}

在此示例中,ArrayOfOne类不需要知道T是什么,但如果您使用它,T将被强类型化。

var arr = new ArrayOfOne<string>();
arr.add("str"); // ok
arr.add(1); //not ok

var str: string = arr.retrieve(); // ok
var num: number = arr.retrieve(); // not ok