
[英]Typescript: How to make a type that is the keys of an interface but only the keys that are strings
[英]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.