多个属性作为打字稿中的索引签名

时间:2019-10-31 15:57:36

标签: typescript redux

因此,我正在开发一个分页系统,并且试图将用户迄今为止搜索的所有页面存储在我们的redux存储中。

我想实现一个看起来像这样的类型:

{skip, limit, filter}: [](this one is an array of numbers)

例如,我可以像这样在其中存储一个新页面:

pages[0,10,array] = [0,1,2,3,4,5,6,7,8,9]
pages[10,20,array] = [10,11,12,13,14,15,16,17,18,19]

因此,简而言之,我想做的是创建一个使用三种不同类型作为索引以及使用数字数组作为值的地图。

我对此进行了一些研究,并且能够找到有关映射类型的documentation,但这并不能真正解决我的问题。

type Index = 'a' | 'b' | 'c'
type FromIndex = { [k in Index]?: number }

const good: FromIndex = {b:1, c:2}

// Error:
// Type '{ b: number; c: number; d: number; }' is not assignable to type 'FromIndex'.
// Object literal may only specify known properties, and 'd' does not exist in type 'FromIndex'.
const bad: FromIndex = {b:1, c:2, d:3};

有人能对此有所启发吗?谢谢您到目前为止的时间:)

1 个答案:

答案 0 :(得分:2)

不能使用多个键。但是,您可以通过将键简单地连接到字符串并将该字符串用作唯一标识符来解决此问题:

const pages:{[key:string]: Array<number>} = {};

// Using just toString() or simple types
const uniqueKey:string = `${skip} ${limit} ${filter}`;
pages[uniqueKey] = [0,1,2,3,4,5];

// Using JSON.stringify()
const uniqueKeyWithObjectInside:string = `${JSON.stringify(obj1)} ${JSON.stringify(obj2)} ${JSON.stringify(obj3)}`;
pages[uniqueKeyWithObjectInside] = [1,2,3,4,5,6];