假设我有一个接口:

interface A {
  foo: number
  bar: string
}

我有一个泛型A
type Option<T> = {
  map: () => T
}

然后我从OptionB创建一个新的接口A
interface B {
  foo: Option<number>
  bar: Option<string>
}

怎样才能使这个手术更通用?我想要的API是:
type B = Lift<A>

其中Option自动将Lift的每个成员映射到A。注意Option可以有任意数量的任何类型的成员。
如何实现A?如果这在TypeScript是不可能的,有人有Scala/Haskell溶液吗?

最佳答案

好消息:对于TypeScript2.1.0,现在可以通过Mapped Types

type Option<T> = { map() => T };
type OptionsHash<T> = { [K in keyof T]: Option<T[K]> };

function optionsFor<T>(structure: T): OptionsHash<T> { ... };

let input = { foo: 5, bar: 'X' };
let output = optionsFor(input);
// output is now typed as { foo: { map: () => number }, bar: { map: () => string } }

反之亦然:
function retreiveOptions<T>(hash: OptionsHash<T>): T { ... };

let optionsHash = {
    foo: { map() { return 5; } },
    bar: { map() { return 'x'; } }
};
let optionsObject = retreiveOptions(optionsHash);
// optionsObject is now typed as { foo: number, bar: string }

关于scala - 我该如何在Typescript中表达这一点?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36900619/

10-10 21:40