我有一个过滤器的映射,定义如下:
type TFiltersNext = { [key: string]: { type: 'date' | 'enum' } }; const filtersNext: TFiltersNext = { foo: { type: 'date' } };
我想在这样的类型中定义有效的筛选器名称:
type TFilterNameNext = keyof typeof filtersNext;
但是,这不起作用,因为此测试不会引起问题:
const filterName: TFilterNameNext = 'bar';
正如我们所看到的, bar 不是有效的筛选器名称。
bar
我在TS游乐场重新创建了这个- https://www.typescriptlang.org/play/?#code/C4TwDgpgBAKgYgSwDbAgJwM4DkIA9hQC8UA3lANoDWEIAXFBsGggHYDmAuvWaJPQOQATAIap+UAD5R+EFgFcAtuIC+UZQG4AUJoDGAexaMoAM2SpMOfPXhn02PAWIlNUE3r3covCAJFi1mhqa3rCIKOhYwgoQlo5Q1CB6xl7gEEkmthYOWvqGBKbhaJHR1mHmxTEORNLG7sL86kA
如果我删除 : TFiltersNext 从…起 const filtersNext: TFiltersNext = { 它是有效的,但后来我失去了对价值观形状的强制执行。
: TFiltersNext
const filtersNext: TFiltersNext = {
有人知道发生了什么事吗?
使用 satisfies 关键字:
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] )
:TFiltersNext
[key: string]