所以我想制作某种基本接口/类型,可以根据它拥有的通用对象扩展属性。
有点像这样:
interface BaseObject<Extension extends object = {}>{
a: string;
b: string;
{...Extension} <<< this is something i know works in object but not here
}
const sample:BaseObject<{x: number}> = {
a: '123',
b: '123',
x: 123 <<<< forcing type check
}
如何做到这一点?
答案 0 :(得分:0)
您可以通过扩展接口本身来实现这一点。
interface LessBaseObject extends BaseObject {
x: number;
}
const sample: LessBaseObject = {
a: '123',
b: '123',
x: 123,
};
答案 1 :(得分:0)
实现此目的的另一种方法是通过 Extension
上的映射类型。无论出于何种原因,TypeScript 都不允许您声明使用映射类型的类型和声明属性类型或在 interace
声明中使用映射类型,但是您可以创建一个类型,即Extension
和基本属性的交集来实现这一点,虽然语法有点时髦:
type BaseObject<
Extension extends object = {},
All = Extension & { a: string; b: string }
> = {
[K in keyof All]: All[K];
};
请注意,使用第二个通用属性并不是绝对必要的。你也可以这样写:
type BaseObject<Extension extends object = {}> = {
[K in keyof (Extension & { a: string; b: string })]: (Extension & {
a: string;
b: string;
})[K];
};