【问题标题】:Typescript key-value pair where key is custom type打字稿键值对,其中键是自定义类型
【发布时间】:2021-03-22 17:24:16
【问题描述】:

我有以下键值对,它被用于过滤系统。当我们应用一个过滤器时,我们可以将它与所有当前的过滤器合并,或者只是应用它并重置以前的过滤器。

type MINE = "mine"
type BOOKMARKED = "bookmarked"
type TEXT_QUERY = "textQuery"
type JobType = "type"

export type PossibleFilterKeys = MINE | BOOKMARKED | TEXT_QUERY | JobType

type Filter = {
    [key in PossibleFilterKeys]: string;
};

那么我有如下函数原型:

const apply = (filter: Filter) => void

当我们使用它时:

// name: PossibleFilterKeys,
// value: string,
apply({[name]: value})

触发:TS2345: Argument of type '{ [x: string]: string; }' is not assignable to parameter of type 'Filter'.   Type '{ [x: string]: string; }' is missing the following properties from type 'Filter': mine, bookmarked, textQuery, type

我想应用一个过滤器,它的键可能是PossibleFilterKeys 类型之一,但它会抛出上面的错误。

为什么会这样?

【问题讨论】:

  • 请分享可重现的例子
  • 感谢@31piy,问题得以解决。正如他所说,我们可以这样做:[key in PossibleFilterKeys]?: string,但我们也可以使用 Partial 实用程序:apply: (filter: Partial<Filter>) => void

标签: typescript


【解决方案1】:

问题在于这句话:

type Filter = {
    [key in PossibleFilterKeys]: string;
};

上面声明Filter必须包含PossibleFilterKeys的所有键。您可以通过以下语法将它们设为可选:

type Filter = {
    [key in PossibleFilterKeys]?: string; // <-- Place a question mark
};

【讨论】:

  • 是的,它有效,谢谢!另一种方式是:apply: (filter: Partial&lt;Filter&gt;) =&gt; void
  • @Stephan882 -- 我认为这不是一个好的选择。你的方法只是解决了一部分,即用部分对象调用函数。那么创建Filter 对象呢?那些仍然需要所有的钥匙。
  • 嗯,你是对的。目前我没有创造任何东西。我们调用该函数,传递一个对象,然后合并或替换当前对象。再次感谢您,非常感谢您的帮助!
猜你喜欢
  • 2019-01-02
  • 2021-05-06
  • 2021-03-04
  • 2020-03-09
  • 2021-01-30
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 2021-04-02
相关资源
最近更新 更多