【发布时间】:2023-03-13 19:10:01
【问题描述】:
对于一个接口,可以使用Partial<X>,Mapped Type 来表示“允许 X 的所有属性,但不要期望它们”。
这样会导致以下编译错误:
interface X { foo: boolean }
function doSomething(x: Partial<X>) {
let aBoolean: boolean = x.foo; // ERROR: possibly undefined
}
doSomething({ foo: true }); // OK
doSomething({}); // OK
doSomething(true); // ERROR: Type 'boolean' has no properties in common with 'Partial<X>'
我想对any 做同样的事情,说“这个函数可以接受任何东西作为参数,但你不能指望那里有任何东西”
function doSomething(x: Partial<any>) {
let aBoolean: boolean = x.foo; // OK, but I wish it wasn't
}
doSomething({ foo: true }); // OK
doSomething({}); // OK
doSomething(true); // OK
doSomething(/* etc. */); // OK
我希望我的函数接受任何东西作为参数,但在函数内部,如果不先检查它们,我应该无法访问对象的任何属性。如果函数内部x 的类型为void 或never,也可以。
我并不惊讶 Partial<any> 没有按我希望的方式工作 - 我绝对不会问“为什么 Partial<any> 不能按我希望的方式工作”。我在问:
我可以为参数x 使用什么类型,这样:
- 它接受任何/每种类型的参数
- 在函数内部,
x的类型可能每个属性都未定义(或者x的类型为void等)
【问题讨论】:
-
只是将
x设为可选? TS playground -
在该示例中执行
!!x.foo或将其更改为{ let bar: string = x.foo; }时没有错误。我错过了什么吗? -
关键是在函数中不能保证
x有什么属性,我希望类型能够反映这一点。
标签: typescript types