假设我有一个函数需要某个接口
interface Foo {
foo: number;
bar: number;
baz?: number;
buz?: number;
}
const doFoo = (params: Foo) => { /* ... */ };
我还有一些常量,其中包含Foo
子集的默认值:
const BASE_PROPERTIES = {
foo: 42,
baz: 9001,
};
doFoo({
...BASE_PROPERTIES,
bar: -1000
});
这很好用。但是我想知道是否有一种方法可以表示BASE_PROPERTIES
包含了Foo
的某些部分。既可以在编辑时提供智能感,又可以清楚地说明常量的用途。本质上是一个自动化的Pick<>
。
我可以
const BASE_PROPERTIES: Partial<Foo> = { /* ... */ }
然而,这将意味着在点差中使用它会给foo
带来错误,因为Type 'number | undefined' is not assignable to type 'number'
。我可以as any
或as Foo
它,但如果我实际上忘记包括foo
,这将以风险换取便利。
同样,我可以使用pick
const BASE_PROPERTIES: Pick<Foo, 'foo' | 'baz'> = { /* ... */ }
但这要求我在使用时不断更新它(有点麻烦,对于非常大的对象来说并不特别枯燥),而且在添加更多属性时不会给我带来智能,有点挫败了一开始添加它的一半意义。
有没有一种方法可以提示typescript,一个对象应该遵循接口的模式,但是它应该弄清楚const实际上是如何适合接口的?
2条答案
按热度按时间xxls0lw81#
您正在查找Typescript 4.9中引入的
satisfies
运算符这将确保
BASE_PROPERTIES
* 满足 * 类型Partial<Foo>
,同时仍然推断文本类型。Playground
r8xiu3jd2#
我想你可以用一个小的效用函数来实现
你应该做智能和类型检查
并且能够将结果与
doFoo
示例合并