Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

typescript interface definition with an unknown property key

Tags:

typescript

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[];
 }
like image 795
bsr Avatar asked May 28 '14 14:05

bsr


3 Answers

Old question, but here is how I solved the issue for myself.

export interface Foo {
    [key: string]: any;
}

{ something: 0 } as Foo => valid

{ other: 'hello' } as Foo => valid
like image 77
laaksom Avatar answered Oct 14 '22 10:10

laaksom


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.

like image 12
Fenton Avatar answered Oct 14 '22 10:10

Fenton


Without interface:

const myFunc = ((myObjectWithSomeKeys: { [key: string]: any }) => {
});
like image 2
David DIVERRES Avatar answered Oct 14 '22 10:10

David DIVERRES