typescript - Typescript:如何提取 const 对象的值类型并将它们用作新类型中的键?
问题描述
我想取一个常量对象,比如说{key1: 'value1', key2: value2'} as const
,并将它的值转换为键,然后在一个新的对象中使用它 type {value1: number; value2: number}
。我想在一个函数中执行此操作,并且希望正确键入该函数。
下面是我试图开始工作的代码。当我尝试将类型的变量强制Partial<Blah>
转换为Blah
. 有人可以解释为什么会发生这种情况,以及是否有办法做我想做的事情?谢谢!
type BaseObject = Record<string, string>;
type ValuesAsKeys<T extends BaseObject> = {
[K in keyof T as T[K]]: number;
};
function useValuesAsKeys<T extends BaseObject>(arg: T): ValuesAsKeys<T> {
const x: Partial<ValuesAsKeys<T>> = {};
for (const value of Object.values(arg) as Array<T[keyof T]>) {
x[value] = 1;
}
// This line doesn't work
return x as ValuesAsKeys<T>;
}
// Example use case
const obj = {key1: 'value1', key2: 'value2'} as const;
const result = useValuesAsKeys(obj); // Type of result is {value1: number; value2: number}
// Everything below here works
// Only including this because I'm contrasting this code with the code above.
type KeysAsKeys<T extends BaseObject> = {
[K in keyof T]: number;
};
function useKeysAsKeys<T extends BaseObject>(arg: T): KeysAsKeys<T> {
const x: Partial<KeysAsKeys<T>> = {};
for (const value of Object.values(arg) as Array<T[keyof T]>) {
x[value] = 1;
}
return x as KeysAsKeys<T>;
}
解决方案
显式返回类型reduce
几乎总是不起作用,因为initial
每次迭代都会改变值。
为了使它工作,最好重载你的函数:
type BaseObject = Record<string, string>;
type ValuesAsKeys<T extends BaseObject> = {
[K in keyof T as T[K]]: number;
};
type Values<T> = T[keyof T]
function useValuesAsKeys<T extends BaseObject>(arg: T): ValuesAsKeys<T>
function useValuesAsKeys<T extends BaseObject>(arg: T) {
return (Object.values(arg) as Array<Values<T>>).reduce((acc, elem) => ({
...acc,
[elem]: 1
}), {})
}
// Example use case
const obj = { key1: 'value1', key2: 'value2' } as const;
const result = useValuesAsKeys(obj); // Type of result is {value1: number; value2: number}
result.value1 //ok
推荐阅读
- odoo-12 - Odoo 新 API:新 API 中 _prepare_order_line_move 方法的等价性是什么?
- java - 在android中将PDF文件转换为字节数组
- c# - 如何将 Filestream 与嵌入式资源文件一起使用?
- javascript - 从 TableSelectDialog 中删除/隐藏搜索栏
- android - Co Routines 从后台获取位置
- asynchronous - 将 Rust 编译为 wasm(Web 程序集)时,我如何才能睡 10 毫秒?
- python-3.x - 识别具有所有(或几乎所有)NaN 值的列,其中目标变量是某个值
- angular - ./node_modules/ng2-charts/fesm5/ng2-charts.js 230:54-72 “在‘@angular/core’中找不到导出‘ɵɵdefineInjectable’
- pyspark - 如何从 Azure 数据工厂运行 python egg(存在于 azure databricks 中)?
- javascript - JavaScript setInterval() 在 Windows CE 设备上不起作用