在打字稿中,我有以下代码:
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
未知的错误
答案 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.
Object.getOwnPropertyNames(array[0])
,它应该通过T对象的所有属性进行迭代。