我一直在试图解决我在打字时遇到的一个非常奇怪的问题。它将内联布尔表达式视为第一个值的类型,而不是完整的表达式。
所以如果你尝试以下简单的方法:
var numericArray:Array<number> = [2,3,4,1,5,8,11];
var sorrtedArray:Array<number> = numericArray.sort((n1,n2)=> n1 > n2);
试一试
您将在排序方法上得到一个错误,表示参数与调用目标的任何签名不匹配,因为您的结果是数值而不是布尔值。我想我漏掉了一些东西,因为我很确定n1>n2是一个布尔命题。
数字
当对数字排序时,你可以使用紧凑比较:
var numericArray: number[] = [2, 3, 4, 1, 5, 8, 11];
var sortedArray: number[] = numericArray.sort((n1,n2) => n1 - n2);
即-而不是<。
其他类型
如果要比较其他内容,则需要将比较结果转换为数字。
var stringArray: string[] = ['AB', 'Z', 'A', 'AC'];
var sortedArray: string[] = stringArray.sort((n1,n2) => {
if (n1 > n2) {
return 1;
}
if (n1 < n2) {
return -1;
}
return 0;
});
对象
对于对象,您可以基于属性进行排序,请记住上面关于能够速记数字类型的信息。下面的示例与类型无关。
var objectArray: { age: number; }[] = [{ age: 10}, { age: 1 }, {age: 5}];
var sortedArray: { age: number; }[] = objectArray.sort((n1,n2) => {
if (n1.age > n2.age) {
return 1;
}
if (n1.age < n2.age) {
return -1;
}
return 0;
});
数字
当对数字排序时,你可以使用紧凑比较:
var numericArray: number[] = [2, 3, 4, 1, 5, 8, 11];
var sortedArray: number[] = numericArray.sort((n1,n2) => n1 - n2);
即-而不是<。
其他类型
如果要比较其他内容,则需要将比较结果转换为数字。
var stringArray: string[] = ['AB', 'Z', 'A', 'AC'];
var sortedArray: string[] = stringArray.sort((n1,n2) => {
if (n1 > n2) {
return 1;
}
if (n1 < n2) {
return -1;
}
return 0;
});
对象
对于对象,您可以基于属性进行排序,请记住上面关于能够速记数字类型的信息。下面的示例与类型无关。
var objectArray: { age: number; }[] = [{ age: 10}, { age: 1 }, {age: 5}];
var sortedArray: { age: number; }[] = objectArray.sort((n1,n2) => {
if (n1.age > n2.age) {
return 1;
}
if (n1.age < n2.age) {
return -1;
}
return 0;
});
我今天在尝试重新创建_时写了这篇文章。sortBy在TypeScript中,我想我会把它留给任何需要的人。
// ** Credits for getKeyValue at the bottom **
export const getKeyValue = <T extends {}, U extends keyof T>(key: U) => (obj: T) => obj[key]
export const sortBy = <T extends {}>(index: string, list: T[]): T[] => {
return list.sort((a, b): number => {
const _a = getKeyValue<keyof T, T>(index)(a)
const _b = getKeyValue<keyof T, T>(index)(b)
if (_a < _b) return -1
if (_a > _b) return 1
return 0
})
}
用法:
它需要一个泛型类型T的数组,因此<T的强制转换扩展{}>,以及使用T[]输入形参和函数返回类型。
const x = [{ label: 'anything' }, { label: 'goes'}]
const sorted = sortBy('label', x)
** getByKey fn在这里找到