我有两个接口,A
和B
。 B
是A
的扩展:
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”方法?
也许我需要使用类来做到这一点?
答案 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
继承自A
。 A
定义属性foo
以及构造函数,该构造函数接受类型为A
的参数并将值从foo
复制过来。
B
定义属性bar
并为其分配默认值。它没有明确定义构造函数。这意味着,如果我们调用new B()
,则实际上是在调用类A
的构造函数。
答案 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"}