Элемент неявно имеет тип 'any', потому что тип 'xxx' не имеет индекса signature.ts (7017) - PullRequest
0 голосов
/ 16 мая 2019

У меня проблема с TS.Я получаю следующую ошибку для этой ветви кода:

Интерфейс:

export default interface IUser {
  username: string;
  email?: string;
  isActive: boolean;
  group: string[];
}

Интерфейс, из которого приходит имя:

interface Field {
  name: string;
  label: string;
  placeholder: string;
  help?: string | React.ReactNode;
}

ОШИБКА:

Element implicitly has an 'any' type because type 'IUser' has no index signature.ts(7017)
const user: IUser

КОД:

      mode === ActionMode.EDIT_INFO && user && user[name]
        ? {
            label: user[name],
            value: user[name]
          }
        : null;

Я читаю в TSДокументы, следующие: https://basarat.gitbooks.io/typescript/docs/types/index-signatures.html

Что заставило меня поверить, что я должен сделать это:

    const defaultValue =
      mode === ActionMode.EDIT_INFO && user && user[name.toString()]
        ? {
            label: user[name.toString()],
            value: user[name.toString()]
          }
        : null;

Но это не помогло.Можете ли вы объяснить, что здесь не так?Нет, я не могу иметь что-то неявное здесь.Где я должен ссылаться на тип?

1 Ответ

1 голос
/ 16 мая 2019

Вы можете использовать индексный доступ в машинописном шрифте к объекту, только если машинописный текст может доказать, что ключ, который вы используете для доступа к объекту, является допустимым ключом для типа.Это означает, что либо аргумент индекса имеет строковый литерал, являющийся ключом объекта, либо сам объект имеет сигнатуру индекса:

Определение сигнатуры индекса:

 export interface IUser {
    [n: string]: string | boolean | string[] | undefined;
    username: string;
    email?: string;
    isActive: boolean;
    group: string[];
}

interface Field {
    name: string;
    label: string;
    placeholder: string;
    help?: string | React.ReactNode;
}

declare let user: IUser;
declare let field: Field;
let value = user[field.name] // ok because of the index signature

Аргумент индекса представляет собой объединение ключей:

export interface IUser {
    username: string;
    email?: string;
    isActive: boolean;
    group: string[];
}

interface Field {
    name: keyof IUser;
    label: string;
    placeholder: string;
    help?: string | React.ReactNode;
}

declare let user: IUser;
declare let field: Field;
let value = user[field.name] // ok because of name is a property of IUser

Я бы рекомендовал использовать против подписи индекса, как только вы добавите, что вы можете получить доступ к объекту с помощью любой ключ (user.notHere не является ошибкой с подписью индекса).

Если у вас уже есть поле name типа string и по какой-то причине вы не можете его изменить, но выдостаточно уверенно, что это ключ интерфейса, вы можете использовать утверждение типа:

export interface IUser {
    username: string;
    email?: string;
    isActive: boolean;
    group: string[];
}

interface Field {
    name: string;
    label: string;
    placeholder: string;
    help?: string | React.ReactNode;
}

declare let user: IUser;
declare let field: Field;
let value = user[field.name as keyof IUser] // ok bacuse of the assertion
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...