выражение типа string не может использоваться для индексации типа

строка не может использоваться для индексации типа ‘T’

У меня включен строгий режим в TypeScript, и у меня возникают проблемы с установкой индекса для объекта, даже если я настроил индексатор строк для его типа.

Отключение noImplicitAny исправляет это, но я бы предпочел этого не делать.

Я внимательно изучил этот ответ, но не добился успеха с предложениями.

Кто-нибудь может увидеть, что я делаю не так?

2 ответа

Это результат # 30769 и известного критического изменения. Ранее мы допускали подобные сумасшедшие вещи без ошибок:

В общем случае ограничение Record на самом деле не гарантирует, что аргумент имеет подпись индекса строки, оно просто гарантирует, что свойства аргумента могут быть присвоены типу XXX. Итак, в приведенном выше примере вы могли эффективно передать любой объект, а функция могла бы писать в любое свойство без каких-либо проверок.

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

Благодаря этому изменению мы теперь знаем, что objectClone имеет подпись индекса строки.

Итак, ваш код должен быть

Отказ от ответственности: это не совсем ответ, а результат моих блужданий по этой теме. Для наглядности пишу ответ.

Заставить это работать

Я использовал площадку для TypeScript и в итоге получил то, что работает под машинопись 4.0.2:

Почему это работает?

Тип пересечения объединяет несколько типов в один. Это позволяет вам складывать существующие типы, чтобы получить единый тип, обладающий всеми необходимыми функциями.

Черт, как бы мне хотелось раньше обращать внимание на эти две строчки.

Следующее объявление тогда является правильным:

Как определено в примечаниях к выпуску TypeScript 2.9, если вы вводите интерфейс с подписью индекса строки, он возвращает объединение строки и числа.

Если тип имеет подпись индекса строки или числа, keyof вместо этого вернет эти типы:

Чтобы убедить себя, я попробовал следующее:

Строка! == строка | количество

И я получил следующую ошибку:

Почему-то пока не понимаю, не работает:

Как это приводит к ошибкам:

Почему явное приведение безопасно

Источник

Приведенный выше код вызывает ошибку TypeScript для оператора messagesвыражение типа string не может использоваться для индексации типа :

TS7053: элемент неявно имеет тип ‘любой’, поскольку выражение типа ‘строка’ не может использоваться для индексации типа ‘; два: ; > ‘. Индексная подпись с параметром типа ‘строка’ не была найдена для типа ‘; два: ; > ‘.

(Я видел пару ответов на StackOverflow, подобных этому, которые относятся к Object.keys, но я не уверен, как это связано с моей ошибкой TypeScript.)

3 ответа

Есть несколько способов сообщить TS, что строка является ключом объекта.

Возможно, вы сможете сделать это, не тестируя его самостоятельно:

Итак, здесь мы должны помнить, что ключи объекта всегда будут объединением литеральных типов, а значения объекта будут объединением типа значения.

В приведенном ниже примере ключи представляют собой объединение «один» и «два», а значения представляют собой только строковый тип (объединение строки и строки является строкой).

Раньше я набирал объект, как показано ниже, поэтому никогда не сталкивался с такой проблемой. Здесь я прямо говорю, что мои объектные ключи имеют строковый тип.

Если вы не хотите явно указывать, что ключи объекта являются строками, тогда лучше всего будет @ lawrence-witt answer. поместиться здесь.

Есть еще один способ сделать ключи объединением «один» и «два».

Источник

Литеральный ключ шаблона имеет тип «любой», поскольку выражение типа «строка» не может использоваться для индексации типа.

Есть ли идиоматический способ проверить тип с помощью TypeScript? Я не хочу, чтобы ошибки пошли по очереди и т. Д. Часть моего кода можно переписать, чтобы использовать существующие свойства, в то время как другой код создает новые свойства из этих существующих свойств, которые индексируются комбинацией имени и номера.

3 ответа

Не стесняйтесь играть с этим TypescriptPlayground.

РЕДАКТИРОВАТЬ:

Затем компилятор интерпретирует строку литерала вашего шаблона как имеющую тип литерала шаблона, который автоматически превращает числовые литералы в строковые литералы и объединяет строки за вас. Итак, все работает так, как вы хотите:

Но оказалось, что это нарушило существующие базы реального кода (особенно для Google, см. microsoft / TypeScript # 42593) и считался слишком странным (см. Обсуждение в microsoft / TypeScript # 42589) и в конечном итоге вернулся в microsoft / TypeScript # 42588.

Хотя это и не идеально, есть способ использовать некоторые проверки типов даже над ключами свойств литералов шаблона. Существуют ограничения на то, в какой степени средство проверки типов TypeScript может проверять код. Пока в коде используется литерал шаблона, TypeScript не может выполнять автоматические проверки типов, но есть возможность использовать не только простые утверждения типа, утверждая типы каждой части шаблона. литерал того же типа, что и ожидалось. Вот пример :

С этим шаблоном кода некоторые ошибки невозможны. Хотя max можно просто заменить на 5 для создания ошибки, max нельзя заменить на 5 без ошибок до времени выполнения.

Источник

Допустим, у меня есть это:

Ошибка находится в color[e] в нижней части с:

Элемент неявно имеет тип ‘any’, поскольку выражение типа ‘string’ не может быть использован для индексации типа ‘< red: null; green: null; blue: null; >‘. В типе ‘ < red: null; green: null; blue: null;>не было обнаружено индексной сигнатуры с параметром типа ‘string’.

2 ответа

Это полная ошибка, которую я получаю, когда навожу курсор на data[command] в limit-entries.ts (параметр) данные: элемент dataProps неявно имеет тип ‘any’, поскольку выражение типа ‘hourly’ не может быть использовано для индексации типа ‘dataProps’. Свойство ‘hourly’ не существует для типа.

Я получаю ошибку: элемент неявно имеет тип ‘any’, поскольку выражение типа ‘POST_TYPE’ не может быть использовано для индексирования типа ‘<>‘ Свойство ‘[POST_TYPE.POST]’ не существует для типа ‘<>‘; ошибка при использовании reduce для функции с таким интерфейсом: // enum export const enum.

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

Дополнительная информация об индексации в TypeScript: индексные подписи

Предполагая, что вы используете TS3.4 или более позднюю версию, самый простой способ получить такой тип вывода от компилятора-это использовать утверждение const :

Ладно, надеюсь, это поможет. Удачи вам!

Похожие вопросы:

Я получаю ошибку ниже. Я знаю, что означает этот код, но я не знаю, как должен выглядеть интерфейс: Элемент неявно имеет тип ‘any’, поскольку индексное выражение не имеет типа ‘number’. интерфейсы.

Этот фрагмент кода хочет присвоить значение словарю типа ключ-строка, а значение-число. let dict: Map = new Map (); dict[one] = 1; Элемент неявно имеет тип.

Это полная ошибка, которую я получаю, когда навожу курсор на data[command] в limit-entries.ts (параметр) данные: элемент dataProps неявно имеет тип ‘any’, поскольку выражение типа ‘hourly’ не может.

Я получаю ошибку: элемент неявно имеет тип ‘any’, поскольку выражение типа ‘POST_TYPE’ не может быть использовано для индексирования типа ‘<>‘ Свойство ‘[POST_TYPE.POST]’ не существует для типа.

Я конвертирую свое приложение react с JavaScript на TypeScript, пытаясь понять, как я могу устранить следующие ошибки Элемент неявно имеет тип ‘any’, поскольку выражение типа ‘string’ не может быть.

Источник

Typescript: тип ‘string’ не может быть использован для индексации типа «< выражение типа string не может использоваться для индексации типа: any; >«

Я создаю функцию, которая добавляет дополнительное свойство к каждому элементу массива:

Но я получил следующую ошибку:

Я не понимаю, почему это происходит, потому что я уже указал T, используя строковый тип индекса, и особенно хорошо работает следующий код:

Есть ли у кого-нибудь идея, почему первый фрагмент кода выдает ошибку и как обойти эту проблему? Спасибо!

1 ответ

Я начал изучать typescript, поэтому я создаю ситуации для разрешения, я получаю ошибку, не знаю почему, см. код выше: interface IObjct < name: string, city: string, age: number, >const john = < name: John, city: London, age: 24 >; const jerry = < name: Jerry, city: Rome, age: 43 >; function.

Вот как это работает:

Таким образом, разница здесь заключается в том, что элементы addedProps2 теперь считаются относящимися к типу , хотя obj относится к типу .

Во всяком случае, надеюсь, что один из них поможет вам дать какое-то направление. Удачи вам!

Допустим, у меня есть это: const color = < red: null, green: null, blue: null >; const newColor = [‘red’, ‘green’, ‘blue’].filter(e => color[e]); Ошибка находится в color[e] в нижней части с: Элемент неявно имеет тип ‘any’, поскольку выражение типа ‘string’ не может быть использован для.

Похожие вопросы:

swagger-api/swagger-codegen генерирует следующий код: private extendObj (objA: T1, objB: T2) < for(let key in objB)< if(objB.hasOwnProperty(key))< objAвыражение типа string не может использоваться для индексации типа = objBвыражение типа string не может использоваться для индексации типа; >> return.

Я получаю следующую ошибку в файле typescript, когда пытаюсь прикрепить обработчик событий click, как показано ниже, Аргумент типа ‘string’ не может быть присвоен параметру типа ‘< выражение типа string не может использоваться для индексации типа.

Пытаюсь реализовать функциональный выщип с помощью звукового типа, но я делаю что-то не так: function pluck (key: Key): (o: Object) => ObjectВыражение типа string не может использоваться для индексации типа <.

У меня есть эта вспомогательная функция: getAndAssignToObject (key: string, objectToAssign: T): Promise < const data = await AppStorage.get (key); Object.keys(data).forEach(.

Я начал изучать typescript, поэтому я создаю ситуации для разрешения, я получаю ошибку, не знаю почему, см. код выше: interface IObjct < name: string, city: string, age: number, >const john = <.

Допустим, у меня есть это: const color = < red: null, green: null, blue: null >; const newColor = [‘red’, ‘green’, ‘blue’].filter(e => color[e]); Ошибка находится в color[e] в нижней части с.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *