Как определить типобезопасные коллекции с ключами Dynami c в Typescript и по-прежнему иметь поддержку intellisense - PullRequest
0 голосов
/ 16 июня 2020

Я использую интерфейсы для определения типобезопасных объектов в Typescript и обеспечения простой в обслуживании структуры кода. Однако в некоторых случаях интеллект нарушен.

Что должно быть лучшим подходом, когда ключи неизвестны, но все еще нужно завершить код?

Вот простой пример, чтобы показать, что я имею в виду:

interface IObject {
  name: string,
  value: number
};

// here is the type safe collection interface
interface ICollection {
  [key: string]: IObject
};

// ...

// here is the type safe collection
let collection: ICollection = {
  a: {
    name: "a",
    value: 1
  },
  b: {
    name: "b",
    value: 2
  }
};

// here is the type unsafe collection
let collection2 = {
  a: {
    name: "a",
    value: 1
  },
  b: {
    name: "b",
    value: 2
  },
  c: {
    key: 1,
    status: true
  }
};

// ...

console.log(collection2.a.value); // this works ok, but it's not type safe
console.log(collection.a.value); // this is type safe, but there is no more intellisense support

1 Ответ

0 голосов
/ 16 июня 2020

Я думаю, вы ищете ответ, описанный здесь: { ссылка }

Что-то вроде этих строк:

interface IObject {
  name: string;
  value: number;
};

interface IUnsafeObject extends Partial<IObject> {
  // if you know the type you can narrow it down here
  // e.g. [key: string]: boolean | number
  [key: string]: any;
}

interface ICollection<TType> {
  [key: string]: TType
};

let collection: ICollection<IObject> = {
  a: { name: "a", value: 1 },
  b: { name: "b", value: 2 }
};

let collection2 : ICollection<IUnsafeObject> = {
  a: { name: "a", value: 1 },
  b: { name: "b", value: 2 },
  c: { key: 1, status: true }
};

Вы также можете добиться того же вещь с типами вместо интерфейсов:

type MyObject = {
  name: string,
  value: number
};

type MyUnsafeObject = { [key: string]: any } & Partial<MyObject>;

См. также:
Частично - https://www.typescriptlang.org/docs/handbook/utility-types.html#partialt
Generics - https://www.typescriptlang.org/docs/handbook/generics.html

...