Укажите другой тип для некоторых ключей словаря в Typescript - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь сделать что-то подобное в Typescript:

type A = 'stuff'
type B = {
  [x: string]: {
    active?: {
      [name: string] : A
    }
    [name: string] : A
  }
}

Но я получаю: Property 'active' of type '{ [name: string]: A; } | undefined' is not assignable to string index type 'A'.

Я понимаю, что active также признается в качестве участника из [имя: строка]. Есть ли что-нибудь, что я могу сделать, чтобы точно указать, что active может содержать что-то отличное от других клавиш?

Надеюсь, это не дубликат, мне было трудно найти хороший способ описать проблему в Google .

** Обновление: **

Следующий код не работает с Typescript

type ImageName = 'test'
type IconEntry = { [name: string]: ImageName }
type Icons = {
  [namespace: string]: IconEntry & {
    active?: IconEntry;
  };
}

const icons: Icons = {
  buttons: {
    switch: 'test',
    active: {
      switch: 'test'
    }
  }
}
Type '{ switch: "test"; active: { switch: "test"; }; }' is not assignable to type 'IconEntry & { active?: IconEntry | undefined; }'.
  Type '{ switch: "test"; active: { switch: "test"; }; }' is not assignable to type 'IconEntry'.
    Property 'active' is incompatible with index signature.
      Type '{ switch: "test"; }' is not assignable to type '"test"'.(2322)
input.ts(4, 3): The expected type comes from this index signature.

1 Ответ

4 голосов
/ 24 апреля 2020

Единственное отличие, которое я вижу в active, состоит в том, что это A | undefined вместо A. Вы можете определить это с помощью типа пересечения :

type A = "stuff";
type B = {
  [x: string]: {[name: string] : A} & {active?: A}
// −−−−−−−−−−−−^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
};

При этом, если у вас есть let b: B, тогда b["x"].active будет иметь тип "stuff" | undefined и b["x"].foo будет иметь тип "stuff".

На игровой площадке

Тот же подход работает, если вы хотите, чтобы active имел совершенно другой тип , не связанные с A:

type A = "stuff";
type A1 = "other stuff";
type B = {
    [x: string]: { [name: string]: A } & { active?: A1 }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...