假设我有以下四个对象:
const foo1: Readonly<{foo: number, bar: ?string}> = {
foo: 123
}
const foo1: Readonly<{foo: number, bar: ?string}> = {
foo: 123,
bar: '1123'
}
const bar1: Readonly<{foo2: number, bar2: ?string}> = {
foo2: 123
}
const foo1: Readonly<{foo: number, bar: ?string}> = {
foo2: 123,
bar2: '1123'
}
我现在想将它们转换Option
为以下形式的 fp-ts 承载对象:
{foo: number, bar: Option<string>}
天真的方法是编写两个函数(或者确实内联进行这些计算):
const makeOptional1 = (obj: Readonly<{foo: number, bar: ?string}>) => {
return (obj.bar === undefined) ? none : some(obj[key]
}
const makeOptional2 = (obj: Readonly<{foo2: number, bar2: ?string}>) => {
return (obj.bar2 === undefined) ? none : some(obj[key]
}
但是说,我想提取一个更抽象的函数,它可以采用任意对象和任意键,并返回正确的选项。
第一次尝试可能看起来像这样:
const optionalKey = <T, D>(val: D, key: string): Option<T> => {
if (val[key] === undefined) {
return none
} else {
return some(val[key])
}
}
这无法编译:
Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'unknown'.
No index signature with a parameter of type 'string' was found on type 'unknown'.ts(7053)
该错误消息非常有意义,但我不知道如何解决它。欢迎任何想法