I want to describe some interface with nested objects. How can I do it without creation of Interfaces for nested objects?
interface ISome {
  strProp:string;
  complexProp:{
    someStrKeyWhichIsDynamic:{
      value:string;
      optValue?:string;
    }
  };
}
I also tried (UPD: it's okay actually)
interface ISome {
  strProp:string;
  complexProp:{
    [someStrKeyWhichIsDynamic:string]:{
      value:string;
      optValue?:string;
    }
  };
}
But I cant to assign an object like
let dynamicStrKey = 'myKey';
  {
   strProp:'str', 
   complexProp:{
     [dynamicStrKey]:{
       value:'something here',
       optValue: 'ok, that too',
    }
  };
to variable with ISome type without type assertion <ISome>. At least WebStorm highlights this assignment as an error.
How to properly describe nested objects?
Finally, I think that my second variant was correct
interface ISome {
  strProp:string;
  complexProp:{
    [someStrKeyWhichIsDynamic:string]:{
      value:string;
      optValue?:string;
    }
  };
}
For dynamic key you can just write [dynamic:string] to specify that here will be some string property. Seems like I had webstorm error which wasn't related to the issue.
BTW, if you have some string based enum, you may want to use [key in MyEnum]: {...} instead of [key:string]. That solves error:
TS1337 an index signature parameter type can not be a union type.
And if you have a literal object, e.g. 
const obj = { prop1: 'blah', prop2: 'blahblah' }
You may want to use [key in keyof typeof obj]: {...} to describe that your dynamic key can be only 'prop1' or 'prop2' (or, more generic, value from Object.keys(obj) )
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With