繁体   English   中英

如何仅收集具有 object 类型的键,其中某些特定键作为 Typescript 接口中的值?

[英]How to only collect keys in a type that has an object with some specific key as a value in Typescript interface?

我有一个像这样的 redux state

interface DataState {
  dashboard: {
    data: DashboardData | null
    isLoading: boolean
    error: string | null
  }
  policySearch: {
    data: PolicySearchData | null
    isLoading: boolean
    error: string | null
  }
  other: {
    someKey: someValue
  }
}

我有一个动作创建者,可以在数据 state 的给定字段中切换isLoading state

toggleDataLoading('policySearch', true)

我不想向toggleDataLoading function 发送错误的第一个参数,所以我有这个:

type FieldsThatHaveLoadingState = 'dashboard' | 'policySearch

因为有些字段不会有isLoading state

我试图想办法用 Typescript 以编程方式从DataState中收集密钥。 javascript 中的内容如下所示:

const keysIWant = {}
Object.keys(dataState).forEach(key => {
 if(dataState[key].isLoading) keysIWant[key] = true
})
type FieldsThatHaveLoadingState = keyof typeof keysIWant

是否可以仅使用 Typescript 类型和检查来进行这种收集?

下面显示的方法正确地将有效密钥限制为 function 调用。

必须有嵌套的分布条件来表达这一点的复杂性有望 go 与 https 上的工作无关://github.com/microsoft/TypeScript/issues/23188

interface DataState {
  dashboard: {
    isLoading: boolean
  }
  policySearch: {
    isLoading: boolean
  }
  other: {
    someKey: 'someValue'
  }
}

type LoadableKey<T = keyof DataState> = T extends keyof DataState ? DataState[T] extends { isLoading: boolean } ? T : never : never

const toggleDataLoading = (stateKey: LoadableKey) => {
  console.log(`Loading ${stateKey}`)
}

toggleDataLoading('dashboard');

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM