typescript interface definition with an unknown property key

typescript

Solution

If you define one interface for the known types and a separate one for the "unknown" types, you could use a type assertion to tell the compiler the one you wanted to use.

It isn't ideal, but you are working in a edge case (i.e. not entirely dynamic, not entirely static).

export interface IMeta{}
export interface IValue{}
export interface IFunkyResponse {
     [index: string]:IValue[];
}
export interface IResponse {
     meta: IMeta;
}

export class Response implements IResponse {
    meta:IMeta;
    values:IValue[];
    books:IValue[];
    anything:IValue[];
}

You can type-assert between `<IResponse> resp` and `<IFunkyResponse> resp` to access one or the other of the styles.

Problem

How to express an interface (IResponse), with one property has a string key (which is not known statically). Below, the key `values` can be anything like `books`, `chairs`, etc. All other keys and types are known statically. Below implementation gives error. I guess the error is because the index signature on the `IResponse` makes all the property values to be `IValue[]`. Is there a way to do this? ``` export interface IMeta{} export interface IValue{} export interface IResponse { meta: IMeta; [index: string]:IValue[]; } export class Response implements IResponse { meta:IMeta; values:IValue[]; //books:IValue[]; //anything:IValue[]; } ```

Original source