作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我将如何在 TypeScript 中输入:
function arrayToObject(array, mapper) {
const result = {};
for(const item of array) {
const [key, value] = mapper(item);
result[key] = value;
}
return result;
}
// returns { '1': 2, '2': 4, '3': 6 }
arrayToObject([1,2,3], v => [v, v * 2])
具体来说,我想让 TypeScript 确保映射器的元组结果是有效的键和值。这不起作用:
function arrayToObject<TItem, TObject>(
array: TItem[],
mapper: (t: TItem) => [P in keyof TObject, TObject[P]]
)
最佳答案
假设 TS3.4 并使用 const
assertions ,(可以更改该技术以支持 TS3.3 并且不需要这样的断言,但它很乏味),我能想到的最强大的类型是:
function arrayToObject<A, K extends keyof any, V>
(array: readonly A[], mapper: (x: A) => readonly [K, V]): { [P in K]: V } {
const result = {} as { [P in K]: V };
for (const item of array) {
const [key, value] = mapper(item);
result[key] = value;
}
return result;
}
const obj1 = arrayToObject([1, 2, 3] as const, v => [v, v * 2] as const)
// const obj1: {1: number, 2: number, 3: number}
const obj2 = arrayToObject(["a", "b", "c"] as const, k => [k, 0] as const);
// const obj2: {a: 0, b: 0, c: 0}
这至少会在映射器的返回类型中保留编译器知道的任何文字键值。类型系统对 higher rank types 的支持不多在一些特定的之外 generic function improvements所以我很难想出任何方法让编译器理解这一点,比如说,
const obj3 = arrayToObject(["a","b","c"] as const, k => [k, k] as const)
将以类型 {a: "a", b: "b", c: "c"}
而不是仍然正确但不是很具体的类型 {a:“a”|“b”|“c”,b:“a”|“b”|“c”,c:“a”|“b”|“c”
。好吧。
希望对您有所帮助;祝你好运!
关于typescript - 在元组中使用映射类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55982646/
如何在每个新行创建一个新数组/元组? 就像我有这个循环来读取文件: for line in csv.reader(f, delimiter='\t', lineterminator='\t\t', d
我正在尝试将值写入(我可以很好地读取)MSSQL 实例。我的代码类似于: import pypyodbc lst = ['val1', 'val2', 'val3'] connection = pyp
我是一名优秀的程序员,十分优秀!