Оригинальный ответ
Если я правильно понимаю, вы запрашиваете проверку во время выполнения, чтобы объект включал все свойства, которые определяет интерфейс. Это невозможно с самим интерфейсом, потому что информация о типе, связанная с интерфейсом, не делает его во время выполнения; другими словами, интерфейс только полезен, когда мы запускаем компилятор TypeScript.
Что вы можете сделать, это создать схему, которая содержит все свойства интерфейса. Затем вы можете зациклить эту схему, чтобы проверить, все ли свойства существуют для вашего объекта. Вот пример того, как это может выглядеть. Я завернул пример в определяемый пользователем тип защиты .
export interface MyDocument {
id: string,
collection: string[];
}
const isMyDocument = (input: any): input is MyDocument => {
const schema: Record<keyof MyDocument, string> = {
id: 'string',
collection: 'array'
};
const missingProperties = Object.keys(schema)
.filter(key => input[key] === undefined)
.map(key => key as keyof MyDocument)
.map(key => new Error(`Document is missing ${key} ${schema[key]}`));
// throw the errors if you choose
return missingProperties.length === 0;
}
const obj = {};
if (isMyDocument(obj)) {
// the compiler now knows that obj has all of its properties
obj.collection;
}
Вот код выше на игровой площадке TypeScript .
Ответ на вопрос в комментариях
Вот как вы можете использовать оператор ...
для расширения схемы.
interface ParentDocument {
id: string,
collection: [],
}
interface ChildDocument extends ParentDocument {
name: string;
}
const schemaParent: Record<keyof ParentDocument, string> = {
id: 'string',
collection: 'array'
};
const schemaChild: Record<keyof ChildDocument, string> = {
name: 'string',
...schemaParent,
};