我有这个打字稿代码:
interface Foo {
foo1: string,
foo2: number,
foo3: boolean
}
const v = <Foo>{foo1: '4'};
此编译-除非对象中所有3个字段都存在,否则如何防止它编译?现在只有一个字段存在。
这是我的用例/原理: https://gist.github.com/ORESoftware/8d02fb30c53c19f6b38bddbc96da2475
但是,如果您这样做的话:
const v : Foo = {foo1: '4'};
然后它将无法编译。如果您这样做的话:
const v = <Foo>{x: '4'};
无法编译。
答案 0 :(得分:1)
它将编译,因为您正在声明。您基本上是在说“相信我,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进行检查。