Он скомпилируется, потому что вы делаете утверждение.Вы в основном говорите: «Поверьте мне, компилятор TypeScript, это правильный тип».Это вообще обходит проверку.
Если ваш объект удовлетворяет типу, вам не нужно делать утверждение .Интерфейсы в TypeScript работают, фактически проверяя, что объект удовлетворяет интерфейсу, а не то, что он явно расширяет / реализует интерфейс.
interface ResponseBody {
foo1: number;
foo2: string;
foo3: boolean;
}
function doSomething(value: ResponseBody) {
console.log("Ok");
}
И, таким образом:
// This will work
doSomething({ foo1: 0, foo2: "zero", foo3: false });
// This will not work
// Argument of type '{ foo1: number; foo2: string; }' is not assignable to parameter of type 'ResponseBody'.
// Property 'foo3' is missing in type '{ foo1: number; foo2: string; }'.
doSomething({ foo1: 0, foo2: "zero" });
// This will not work
// Type 'number' is not assignable to type 'string'.
doSomething({ foo1: 0, foo2: 1, foo3: false });
// This will work
const r1: ResponseBody = { foo1: 4, foo2: "four", foo3: true };
// This will not work
// Type 'string' is not assignable to type 'number'.
const r2: ResponseBody = { foo1: '4' };
// This will not work
// Type '{ foo1: number; }' is not assignable to type 'ResponseBody'.
// Property 'foo2' is missing in type '{ foo1: number; }'.
const r3: ResponseBody = { foo1: 4 };
Итак, основной ответ: удалить <Foo>
.Вам это не нужно.
Теперь, если объект, который вы передаете doSomething
, приходит откуда-то еще и имеет тип any
, TypeScript не может выполнить проверку.Так что не получится.Это те случаи, когда вам нужно добавить утверждение, чтобы TypeScript знал, что вы знаете, что делаете.Но это потому, что объект (и его поля) неизвестны во время компиляции, и поэтому вообще не могут быть проверены TypeScript.