首页 > 解决方案 > 如何定义一个接口,其键限制为此类对象数组中每个对象中包含的属性值的联合?

问题描述

interface Filter {
    id: string;
    name: string;
}

type Filters = Filter[];

const filters = [{ id: 'f1', name: 'f1name'}, { id: 'f2', name: 'f2name'}]

interface State { ... }

const state = {
    f1: any,
    f2: any
}

我想输入state. 我想要一个State类型,它是一个与 中的对象具有相同数量的属性的对象filters,并且我想将每个属性的类型限制为id来自 的属性类型的联合filters

在上面的示例中, state 是 type State,即“具有'f1' | 'f2'具有 value的键的对象any

标签: typescript

解决方案


如果您声明过滤器as const以保留字符串文字类型,您可以这样做:

const filters = [{ id: 'f1', name: 'f1name' }, { id: 'f2', name: 'f2name' }] as const

type Id = (typeof filters)[number]['id']
type State = Record<Id, any>

const state: State = {
    f1: 42,
    f2: 'any'
}

TypeScript 游乐场


推荐阅读