打字稿:禁止使用带有未定义值的接口作为右侧值

时间:2018-11-16 16:06:02

标签: typescript

我要完成以下任务:

假设我有这个:

interface Foo {
    bar: number
    bas: string
}

let foo = {} as Foo;
foo.bar = 123;

如何确保我的接口的所有成员在编译时都具有非null值? 例如像这样:

let x = foo.bas;

应该导致错误。

我知道可能的实现是通过构造函数实现的,但实际上我有许多接口可以用作API的自文档说明,并且我不想更改所有接口(或者我可以为它们创建一个基类)确保所有成员都具有不确定性)?

我当然可以执行以下操作:

let x : Foo = {
bar: 1
bas: 'x'
}

但是,如果我现在还不知道bas并且我有意地希望它未定义怎么办,因为稍后我会知道bas,但是我想知道我忘记初始化{{ 1}}是在我访问bas的那一行的编译时?

1 个答案:

答案 0 :(得分:2)

您正在使用演员表。在这个方向上,您无能为力。
以这种方式使用强制类型转换可以避免很多Typescripts检查,因为您基本上是在告诉它忽略错误。您给它提供一个对象,该对象显然与合同不匹配,然后您告诉它将其视为与合同匹配。这样就可以了。

但是,您可以改为使用接口类型的声明变量:

let foo: Foo = {
  bar: 123
}; // will result in an error, because bas is required.

关于您的更新:
这是不可能的。变量要么与合同匹配,要么不匹配。该检查是在分配时发生的,而不是在使用属性时发生的。