Я хочу проверить, соответствует ли создаваемый мной объект определенному интерфейсу, но я также хочу оставить исходный тип нетронутым.
Я знаю, что могу добиться этого, используя немедленно вызываемое выражение функции, например так ...
interface MustHaveThingy {
thingy: any;
}
const originalType = (function<T extends MustHaveThingy>(obj: T) {return obj;})({
thingy: 'something',
somethingElse: 'this is part of the type',
});
The type of
originalType
is typed as{thingy: string; somethingElse: string;}
but it still conforms to the interfaceMustHaveThingy
.
... но это некрасиво. Есть ли способ достичь вышеизложенного без немедленного вызова выражения функции?
Я ищу целое - T extends SomeOtherType
, где подразумевается фактический тип T
, но T
должен соответствовать SomeOtherType
- но без функции.
Вы можете использовать as
в отдельном заявлении.
interface MustHaveThingy {
thingy: any;
}
const originalType = {
thingy: 'something',
somethingElse: 'this is part of the type',
};
originalType as MustHaveThingy; // <- assertion
Удаление строки thingy: 'something'
дает:
foo.ts(9,1): error TS2352: Type '{ somethingElse: string; }' cannot be converted to type 'MustHaveThingy'. Property 'thingy' is missing in type '{ somethingElse: string; }'.
Это работает! Я не думал об этом. Знаете ли вы, как это сделать, чтобы не выводить утверждение утверждения в javascript?