强制对象值的形状,同时将键仍视为 const

问题描述 投票:0回答:1

我有一个像这样定义的过滤器地图:

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 = {
,它会起作用,但随后我会失去对值形状的强制执行。

有人知道怎么回事吗?

typescript
1个回答
0
投票

使用

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]
)

© www.soinside.com 2019 - 2024. All rights reserved.