在方法TypeScript中使用泛型类型

时间:2017-06-13 06:34:29

标签: javascript typescript

在打字稿中,我有以下代码:

public static sortByProperty<T>( array: T[], prop: string ): void 
{
      var availProps: string[] = Object.getOwnPropertyNames( T ); // or something typeof T, anyway I got error

      if(availProps.length>0 && availProps.indexOf(prop) > -1){
          return array.Sort(function(a, b) {
               var aItem = a[prop];
               var bItem = b[prop]; 
               return ((aItem < bItem ) ? -1 : ((aItem > bItem ) ? 1 : 0));
          });
      }
}

我希望像

一样使用
Test.sortByProperty<MyObject>(arrayOf_MyObject, "APropertyName");

我收到T未知的错误

2 个答案:

答案 0 :(得分:2)

为什么不让编译器为你做属性检查。您可以将prop参数键入为keyof T,编译器将对其进行强制执行。

class Test {
  public static sortByProperty<T>(array: T[], prop: keyof T): void {

      array.sort(function (a, b) {
        var aItem = a[prop];
        var bItem = b[prop];
        return ((aItem < bItem) ? -1 : ((aItem > bItem) ? 1 : 0));
      });
  }
}

interface MyObject {
  test: string
}

Test.sortByProperty<MyObject>([{test: "something"}], "test"); // OK
Test.sortByProperty<MyObject>([{test: "something"}], "notaprop"); // Error

要回答原始问题,如果您想亲自检查属性,则必须将值传递给Object.getOwnPropertyNames,例如:Object.getOwnPropertyNames(array[0]),假设您的数组至少有一个项目。

答案 1 :(得分:0)

您必须将数组元素传递给Object.getOwnPropertyNames()而不是T.

只有在编译完成后,才能在Javascript中使用它。它仅适用于Typescript。您可以使用Object.getOwnPropertyNames(array[0]),它应该通过T对象的所有属性进行迭代。