约束键,因此它只能引用 Item 的键,这些键是数字或日期
Constrain key so it can only reference keys of TItem that are number or Date
我正在尝试限制键,以便它只能引用 TItem 的键,这些键是数字或日期。
public static indexOfMin<TItem extends object | number | Date>(array: Array<TItem>, key?: keyof TItem): number {
let min: number = Number.MIN_SAFE_INTEGER;
let index: number = -1;
const length = array.length;
for (let i = 0; i < length; i++) {
const value = Number(isNullOrUndefined(key) ? array[i] : array[i][key]);
if (value < min) {
min = value;
index = i;
}
}
return index;
}
interface IPerson {
name: string;
age: number;
dob: Date;
}
indexOfMin(new Array<IPerson>(), 'name'); // error as name is string.
indexOfMin(new Array<IPerson>(), 'age'); // ok are age is number.
indexOfMin(new Array<IPerson>(), 'dob'); // ok are age is Date.
您也可以通过添加条件类型来实现。它看起来有点复杂,但可以完成工作。关于 Distributive conditional types.
的 TypeScript 文档章节中有一个类似的示例
下面是一个示例,您可以如何定义这样一种类型,它只选择 属性 个名称,这些名称是数字和日期:
type NumberOrDatePropertyNames<T> = { [K in keyof T]: T[K] extends number | Date ? K : never }[keyof T];
K 是类型 T 的键。然后你用键 K 限制实际 属性 类型的 T[K],条件类型 returns如果 属性 是数字或日期,则键 K 否则它匹配到从不,这意味着它被忽略。
然后您的函数参数可以更改为使用此类型,键将仅限于数字和日期属性。
public static indexOfMin<TItem extends object | number | Date>(array: Array<TItem>, key?: NumberOrDatePropertyName<TItem>): number {
let min: number = Number.MIN_SAFE_INTEGER;
let index: number = -1;
const length = array.length;
for (let i = 0; i < length; i++) {
const value = Number(isNullOrUndefined(key) ? array[i] : array[i][key]);
if (value < min) {
min = value;
index = i;
}
}
return index;
}
我正在尝试限制键,以便它只能引用 TItem 的键,这些键是数字或日期。
public static indexOfMin<TItem extends object | number | Date>(array: Array<TItem>, key?: keyof TItem): number {
let min: number = Number.MIN_SAFE_INTEGER;
let index: number = -1;
const length = array.length;
for (let i = 0; i < length; i++) {
const value = Number(isNullOrUndefined(key) ? array[i] : array[i][key]);
if (value < min) {
min = value;
index = i;
}
}
return index;
}
interface IPerson {
name: string;
age: number;
dob: Date;
}
indexOfMin(new Array<IPerson>(), 'name'); // error as name is string.
indexOfMin(new Array<IPerson>(), 'age'); // ok are age is number.
indexOfMin(new Array<IPerson>(), 'dob'); // ok are age is Date.
您也可以通过添加条件类型来实现。它看起来有点复杂,但可以完成工作。关于 Distributive conditional types.
的 TypeScript 文档章节中有一个类似的示例下面是一个示例,您可以如何定义这样一种类型,它只选择 属性 个名称,这些名称是数字和日期:
type NumberOrDatePropertyNames<T> = { [K in keyof T]: T[K] extends number | Date ? K : never }[keyof T];
K 是类型 T 的键。然后你用键 K 限制实际 属性 类型的 T[K],条件类型 returns如果 属性 是数字或日期,则键 K 否则它匹配到从不,这意味着它被忽略。
然后您的函数参数可以更改为使用此类型,键将仅限于数字和日期属性。
public static indexOfMin<TItem extends object | number | Date>(array: Array<TItem>, key?: NumberOrDatePropertyName<TItem>): number {
let min: number = Number.MIN_SAFE_INTEGER;
let index: number = -1;
const length = array.length;
for (let i = 0; i < length; i++) {
const value = Number(isNullOrUndefined(key) ? array[i] : array[i][key]);
if (value < min) {
min = value;
index = i;
}
}
return index;
}