需要定义对象的任一属性的 typescript 类型 : how?

标签 typescript types static-analysis typechecking

我有以下 TypeScript 代码:

interface qux {
    foo?: string;
    bar?: number | string;
}

function foobar(x: qux) { ...; something_frobz(x); ...; }

问题:我可以调用 foobar("hello, world"),即使这会导致 something_frobz 行为不当。我想在编译时捕获并拒绝使用字符串参数对 foobar 的调用,同时尽可能少地改变 qux 的结构。解决这个问题的最佳方法是什么?

我自己的解决方案是使一个字段为必填;该字段有一个合理的默认值,并且 AFAIK 字符串没有任何同名的字段。这有点像黑客,但它确实有效。

另一种方法可能是让 foobar 采用 first-field-is-required | 的联合类型。第二个字段为必填项 | ... | Hundredth-field-is-required,但随后我必须维护 qux 的 N 个几乎相同的副本(对于 N > 1),而这永远不会顺利。

还有什么更好的吗?

最佳答案

typescript 版本 2.2 - 2.3

为了防止将“基元”作为参数传递,您可以要求它是一个对象:

function foobar(x: qux & object) { }

foobar(''); //error
foobar(1); //error
foobar({a:1}); //error

foobar({foo:'bar'}); //ok

Typescript 版本 >= 2.4 不再需要 object 约束。有关更多信息,请参阅@dbandstra 的回答。

关于需要定义对象的任一属性的 typescript 类型 : how?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44907943/

相关文章:

java - android apk静态分析工具

c# - 是否可以对潜在的空对象引用进行静态代码验证?

typescript - `Index signature of object type implicitly has an ' 任何类型是什么意思。`

node.js - 是否可以强制 typescript 使用DefinitelyTyped 中的类型而不是 native lib 类型?

javascript - 如何在 Angular2/Angular4 中的 native 元素上使用 querySelector 触发子元素上的单击事件

angular - 如何使用 float 标签进行 ionic 选择

.net - VB.Net - 将处理程序添加到未知类型的对象?

Scala:空和无

haskell - 镜头的用途/用途是什么?

c - 使用编译器警告捕获常量1的左移溢出?