JSFiddle - React, Tailwind, and code Playground

TypeScript

interface IStringPropertySpecification {
  type: PROPERTIES_TYPES.STRING;
  required: boolean;
  nullable?: boolean;
  newName?: string;
  emptyStringIsAllowed: boolean;
  allowedValues?: Array<string>;
  invalidValueSubstitution: string;
  defaultValue?: string;
}

interface IObjectDataSpecification__StringKeys {
  nameForLogging: string;
  properties: {
    [propertyName: string]: IStringPropertySpecification;
  };
}

interface IObjectDataSpecification__NumberKeys {
  nameForLogging: string;
  properties: {
    [propertyName: number]: IStringPropertySpecification;
  };
}

type ObjectDataSpecification = IObjectDataSpecification__StringKeys | IObjectDataSpecification__NumberKeys;

enum PROPERTIES_TYPES {
  NUMBER = "NUMBER",
  STRING = "STRING"
  // ETC.
}


const dataSpecification: ObjectDataSpecification = {
  nameForLogging: "Test",
  properties: {
    foo: "asdfsadffsd" // Valid!!!
  }
};

console.log(dataSpecification);