TypeScript:通过重用键而不是值来从其他界面派生界面

时间:2017-03-02 16:27:49

标签: typescript

给定接口A

interface A {
  foo: string;
  bar: boolean;
}

我想使用以下属性派生另一个接口B

interface B {
  foo: SomeOtherInterface;
  bar: SomeOtherInterface;
}

是否可以这样做?

到目前为止,我可以通过type X = keyof A提取密钥,但是我无法使用这些密钥导出接口B.

不幸的是,以下不起作用

interface B {
  [K keyof A]: SomeOtherInterface
}

奖金问题: 接口C怎么样?

interface C {
  foo: SomeOtherGenericInterface<string>;
  bar: SomeOtherGenericInterface<boolean>;
}

2 个答案:

答案 0 :(得分:1)

  

给定接口A

interface A {
  foo: string;
  bar: boolean;
}
     

我想使用以下属性派生另一个接口B

interface B {
  foo: SomeOtherInterface;
  bar: SomeOtherInterface;
}

你可以这样做:

interface A {
  foo: string;
  bar: boolean;
}

interface SomeOtherInterface {
    other: string;
}

type B = {
  [K in keyof A]: SomeOtherInterface
}

// Example
const b: B = {
    foo: { other: "foo" },
    bar: { other: "bar" }
}
  

奖金问题:接口C怎么样?

interface C {
  foo: SomeOtherGenericInterface<string>;
  bar: SomeOtherGenericInterface<boolean>;
}

认为这就是你想要的:

interface SomeOtherGenericInterface<T> {
    value: T;
}

type DerivedTypeWithSomeOtherGenericValues<T, V extends { [K in keyof T]: any }> = {
    [K in keyof T]: SomeOtherGenericInterface<V[K]>
}

type C = DerivedTypeWithSomeOtherGenericValues<A, { foo: string, bar: number }>;

// Example
const c: C = {
    foo: { value: "foo" },
    bar: { value: 123 }
}

Example in the Playground

答案 1 :(得分:0)

下面究竟什么不起作用?您是否收到编译错误或者它在概念上不起作用?

interface B {
    [K keyof A]: SomeOtherInterface
}

可能是你必须做的

interface B<A> {
    [K keyof A]: SomeOtherInterface
}

此外,我想知道类似B的类型的目的是什么,其中所有属性都是完全相同的类型?