代码之家  ›  专栏  ›  技术社区  ›  Noitidart

强制对象值的形状,同时将关键帧仍视为常量

  •  0
  • Noitidart  · 技术社区  · 2 年前

    我有一个过滤器的映射,定义如下:

    type TFiltersNext = { [key: string]: { type: 'date' | 'enum' } };
    
    const filtersNext: TFiltersNext = {
      foo: { type: 'date' }
    };
    

    我想在这样的类型中定义有效的筛选器名称:

    type TFilterNameNext = keyof typeof filtersNext;
    

    但是,这不起作用,因为此测试不会引起问题:

    const filterName: TFilterNameNext = 'bar';
    

    正如我们所看到的, bar 不是有效的筛选器名称。

    我在TS游乐场重新创建了这个- https://www.typescriptlang.org/play/?#code/C4TwDgpgBAKgYgSwDbAgJwM4DkIA9hQC8UA3lANoDWEIAXFBsGggHYDmAuvWaJPQOQATAIap+UAD5R+EFgFcAtuIC+UZQG4AUJoDGAexaMoAM2SpMOfPXhn02PAWIlNUE3r3covCAJFi1mhqa3rCIKOhYwgoQlo5Q1CB6xl7gEEkmthYOWvqGBKbhaJHR1mHmxTEORNLG7sL86kA

    如果我删除 : TFiltersNext 从…起 const filtersNext: TFiltersNext = { 它是有效的,但后来我失去了对价值观形状的强制执行。

    有人知道发生了什么事吗?

    1 回复  |  直到 2 年前
        1
  •  1
  •   Tal Rofe    2 年前

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

    推荐文章