除非所有字段都存在,否则禁止编译



我有这样的类型脚本代码:

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'};

无法编译。

它将编译,因为您正在执行断言。你基本上是在说"相信我,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进行检查。

最新更新