如何将具有一个接口的对象适配到另一个接口?

时间:2019-09-05 15:42:22

标签: typescript

我有两个接口,ABBA的扩展:

interface A {
    foo: string;
}

interface B extends A {
    bar: string;
}

此外,我还有一个对象a,它具有A接口:

const a: A = {
    foo: "fooValue"
}

我需要构建一个函数,该函数根据接口B的输入来创建接口A的新对象,并添加一个默认值。

我创建了一个:

function AtoB(a: A): B {
    return {
        ...a,
        bar: "defaultBarValue"
    };
}

但是此功能对B接口了解得太多。而且,一旦我更改了B界面,我还需要一直更改此功能。

也许有人知道构建此类功能的其他“ TypeScript”方法?

也许我需要使用类来做到这一点?

2 个答案:

答案 0 :(得分:1)

  

我想在一处定义B接口和默认值

这可能是一个类的好用例。当然,可以用许多不同的方式完成此操作,而我对您的用例并不了解,但这是一种可能性:

class A {
  foo: string;

  constructor(a: A) {
    this.foo = a.foo;
  }
}

class B extends A {
  bar: string = 'barDefault';
}

function AtoB(a: A): B {
  return new B(a);
}

我们现在有了一个类层次结构,其中B继承自AA定义属性foo以及构造函数,该构造函数接受类型为A的参数并将值从foo复制过来。

B定义属性bar并为其分配默认值。它没有明确定义构造函数。这意味着,如果我们调用new B(),则实际上是在调用类A的构造函数。

Playground

答案 1 :(得分:0)

您可以定义默认值,然后推断类型:

interface A {
    foo: string;
}

const b = {
    bar: "defaultBarValue",
    baz: "anotherDefault"
}

type B = typeof b & A;

const a: A = {
    foo: "fooValue"
}

function AtoB(a: A): B {
    return {
        ...a,
        ...b
    };
}

console.log(AtoB(a)) // {foo: "fooValue", bar: "defaultBarValue", baz: "anotherDefault"}

TypeScript playground