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

时间:2018-11-15 21:56:29

标签: typescript tsc typescript3.0

我有这个打字稿代码:

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

无法编译。

1 个答案:

答案 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进行检查。