TypeScript:在 keyof T 获取 属性 的类型
TypeScript: Getting the type of the property at keyof T
我在使用 TypeScript 及其打字系统时获得了一些乐趣 - 这并不重要,但也许你们中的一些人和我一样觉得这很有趣。
因为我经常发现自己根据所述对象的属性对数组进行排序,所以我心想,“为什么不实现一个 sortBy 函数呢?”。
Array.prototype.sortBy = function <T, P extends keyof T>(
this: T[],
compareFn: (a: unknown, b: unknown) => number,
key: P
): T[] {
return this.sort((a, b) => compareFn(a[key], b[key]));
};
用法:
interface A {
keyA: string;
keyB: number;
}
const arr: A[] = [
{ keyA: "a", keyB: 42 },
{ keyA: "b", keyB: 1337 },
{ keyA: "c", keyB: -1 },
];
arr.sortBy((a: number, b: number) => b - a, "keyB");
实现有效,我认为甚至可以将键列表作为类型变量是很酷的——据我所知,例如在 C# 中这种行为是不可能的。
我只想清理最后一件事 - 比较器的 unknown
类型。编译器无法在运行时之前捕获任何错误,这可能很危险。是否可以告诉 TS “属性 P 在 T 中的类型”?
我想像 K extends typeof P in T
或 K extends typeof T[P]
。
如果可能的话,我什至可以在函数声明中添加子键,以便在对象树的更深处搜索属性。
PS:我知道这是一个非常人为的问题,而且我认为 K extends typeof T[P]
在很多情况下根本没有用。但是玩代码和讨论它是非常有趣的,并且加深了对相关语言的理解。
您所要做的就是引用键值:T[P]
参见:
Array.prototype.sortBy = function <T, P extends keyof T>(
this: T[],
compareFn: (a: T[P], b: T[P]) => number,
key: P
): T[] {
return this.sort((a, b) => compareFn(a[key], b[key]));
};
我在使用 TypeScript 及其打字系统时获得了一些乐趣 - 这并不重要,但也许你们中的一些人和我一样觉得这很有趣。
因为我经常发现自己根据所述对象的属性对数组进行排序,所以我心想,“为什么不实现一个 sortBy 函数呢?”。
Array.prototype.sortBy = function <T, P extends keyof T>(
this: T[],
compareFn: (a: unknown, b: unknown) => number,
key: P
): T[] {
return this.sort((a, b) => compareFn(a[key], b[key]));
};
用法:
interface A {
keyA: string;
keyB: number;
}
const arr: A[] = [
{ keyA: "a", keyB: 42 },
{ keyA: "b", keyB: 1337 },
{ keyA: "c", keyB: -1 },
];
arr.sortBy((a: number, b: number) => b - a, "keyB");
实现有效,我认为甚至可以将键列表作为类型变量是很酷的——据我所知,例如在 C# 中这种行为是不可能的。
我只想清理最后一件事 - 比较器的 unknown
类型。编译器无法在运行时之前捕获任何错误,这可能很危险。是否可以告诉 TS “属性 P 在 T 中的类型”?
我想像 K extends typeof P in T
或 K extends typeof T[P]
。
如果可能的话,我什至可以在函数声明中添加子键,以便在对象树的更深处搜索属性。
PS:我知道这是一个非常人为的问题,而且我认为 K extends typeof T[P]
在很多情况下根本没有用。但是玩代码和讨论它是非常有趣的,并且加深了对相关语言的理解。
您所要做的就是引用键值:T[P]
参见:
Array.prototype.sortBy = function <T, P extends keyof T>(
this: T[],
compareFn: (a: T[P], b: T[P]) => number,
key: P
): T[] {
return this.sort((a, b) => compareFn(a[key], b[key]));
};