我有一个像这样定义的过滤器地图:
type TFiltersNext = { [key: string]: { type: 'date' | 'enum' } };
const filtersNext: TFiltersNext = {
foo: { type: 'date' }
};
我想在这样的类型中定义有效的过滤器名称:
type TFilterNameNext = keyof typeof filtersNext;
但是这不起作用,因为此测试不会引起问题:
const filterName: TFilterNameNext = 'bar';
正如我们所见,
bar
不是有效的过滤器名称。
我在 TS Playground 中重新创建了这个 - https://www.typescriptlang.org/play/?#code/C4TwDgpgBAKgYgSwDbAgJwM4DkIA9hQC8UA3lANoDWEIAXFBsGggHYDmAuvWaJPQOQATAIap+UAD5R+EFgFcAtuIC+UZQG4AUJoDGAexaMoAM2SpMO fPXhn02PAWILNUE3r3covCAJFi1mhqa3rCIKOhYwgoQlo5Q1CB6xl7gEEkmthYOWvqGBKbhaJHR1mHmxTEORNLG7sL86kA
如果我从
: TFiltersNext
中删除 const filtersNext: TFiltersNext = {
,它会起作用,但随后我会失去对值形状的强制执行。
有人知道怎么回事吗?
使用
satisfies
关键字:
type TFiltersNext = { [key: string]: { type: 'date' | 'enum' } };
const filtersNext = {
foo: { type: 'date' }
} satisfies TFiltersNext;
type TFilterNameNext = keyof typeof filtersNext;
const filterName: TFilterNameNext = 'fooa';
然后你会得到错误并得到显式的键。你不能明确地告诉对象的类型是
:TFiltersNext
,因为它的键被声明为任何 ([key: string]
)