给定接口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>;
}
答案 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 }
}
答案 1 :(得分:0)
下面究竟什么不起作用?您是否收到编译错误或者它在概念上不起作用?
interface B {
[K keyof A]: SomeOtherInterface
}
可能是你必须做的
interface B<A> {
[K keyof A]: SomeOtherInterface
}
此外,我想知道类似B
的类型的目的是什么,其中所有属性都是完全相同的类型?