首先 - 对不起,很长的解释,但我不确定如何在没有它的情况下足够清楚地表达我想要的东西。但是......我正在 React 中制作一个 Table 组件(使用打字稿)。我在想类似的事情:
const data = [
{ id: 1, name: "Peter", age: 43, country: "USA" },
{ id: 2, name: "Stewie", age: 2, country: "UK" },
{ id: 3, name: "Brian", age: 10, country: "Spain" },
]
<Table
data={data}
headers={[
{
title: 'Name',
value: 'name'
},
{
title: 'Age (In Years)',
value: 'age'
},
]} />
所以我想确保选择的值仅限于原始数据的道具。我用这个界面做的:
interface HeaderData<ItemKey> {
accessor: ItemKey;
title: string;
}
interface Props<Item> {
data: Array<Item>;
headers: Array<HeaderData<keyof Item>>;
}
效果很好。所以现在问题来了。我想包括添加新行的能力。因此,为了实现这一点,我正在为每一列呈现一个文本框,并且我想跟踪使用 useState 为列输入的数据。所以我可以写以下内容:
const [data, setData] = useState<Partial<Item>>({});
然后边走边设置数据。但我真的很想将数据对象基于标题,这样如果标题只是示例中的名称和年龄。我只有 { name: string, age: string } 的数据对象
所以本质上 useState 默认值是:
const [data, setData] = useState(
headers.reduce((curr, next) => ({ ...curr, [next.value]: "" }), {})
);
当我查看打字稿将其解释为 {} 时 - 但是当我后来尝试使用 data[header.value] 访问它时,它会抱怨
Type 'keyof T' cannot be used to index type '{}'.
如果我这样做也无济于事: data[header.value.toString()] 或类似的东西也没有。
我需要设置什么类型才能对“数据”施加约束,以便我只获得“标题”值?
谢谢阅读 ;)
编辑:感谢@JonathanHamel 指出一个明显的错误。但是类型问题仍然存在。