После долгих поисков я обнаружил, что проблема на самом деле заключается в том, как определяется AsyncProps
, потому что в его теле находится индексная сигнатура, которая заставляет Exclude
или Omit
работать неправильно.
Чтобы проиллюстрировать проблему:
// This type accepts the known keys `a` and `b` as strings and anything
// else with unknown keys
type MyType = {
a: string;
b: string;
[key: string]: any; // index signature
};
type MyTypeWithoutA = Omit<MyType, "a">;
// I expected the object below to complain for the fact, that "b" is not defined
// but it doesn't happen
const obj: MyTypeWithoutA = {};
Решение, которое я нашел, состояло в том, чтобы сначала получить производный тип MyType
без подписи индекса и создать альтернативную версию Omit
type KnownKeys<T> = {
[K in keyof T]: string extends K ? never : number extends K ? never : K
} extends { [_ in keyof T]: infer U } ? U : never;
// K is the union of keys I want to omit from the known keys of T
type OmitKnownKeys<T, K extends string> = Omit<Pick<T, KnownKeys<T>>, K>;
Переписать код на
type MyTypeWithoutA = OmitKnownKeys<MyType, "a">;
const obj: MyTypeWithoutA = {}; // error, b is not defined (what I wanted)
Важно : это решение работает для моего конкретного c случая, но фактически удаляет сигнатуру индекса из вашего типа делая его менее гибким, другими словами, вы не можете передавать аргументы, которые будут соответствовать сигнатуре индекса. Отметьте эту версию , если хотите сохранить подпись индекса.
Источники: 1 , 2