Cannot find name keyof typescript

Muhammad Hassan

Full Stack Developer | ASP.NET | MVC | WebAPI | Advanced Javascript | AngularJS | Angular2 | C# | ES6 | SQL | TypeScript | HTML5 | NodeJS, MS candidate @LUMS, Grad & EX-Adjunct Faculty @NUCES-FAST, seasonal blogger & open-source contributor. Seattle, WA.

Contact me

Recent Posts

Goodies

  • .NET Tips/Tricks (19)
  • Angular2 (62)
  • AngularJS (54)
  • Announcements (5)
  • ASP.NET CORE (8)
  • ASP.NET MVC (17)
  • ASP.NET WebAPI (15)
  • ASP.NET WebForms (3)
  • Azure (1)
  • bootstrap (2)
  • C# (16)
  • CSS3.0 (5)
  • Elastic Search (17)
  • Entity Framework (6)
  • entity framework core (1)
  • HTML5 (4)
  • IIS (3)
  • Improve Performance (3)
  • Interview Questions (1)
  • Javascript (66)
  • jQuery (9)
  • Node.js (37)
  • SQL Server (5)
  • TypeScript (5)
  • Underscore.JS (1)
  • Visual Studio (16)
  • Web Articles (4)
  • Web Tools (6)

Archives

  • May 2017 (2)
  • March 2017 (12)
  • February 2017 (16)
  • December 2016 (39)
  • October 2016 (18)
  • September 2016 (27)
  • August 2016 (7)
  • July 2016 (4)
  • February 2016 (13)
  • December 2015 (25)
  • November 2015 (16)
  • October 2015 (4)
  • September 2015 (18)
  • July 2015 (1)
  • April 2015 (29)
  • January 2015 (11)

Top Posts & Pages

Blog Stats

Follow Blog via Email

Angular2: Error – Cannot find name ‘many’ and namespace ‘_’ issues with Lodash in Angular2 application using Typescript

I have consumed lodash in previous project and blogged about it (link)

In the recent project when I updated lodash and typescript to their respective latest version. I start getting error in Visual Studio 2015.

Below is the list of error in VS:

Duplicate identifier '_'. Cannot find name 'Partial'. Cannot find namespace '_'. A computed property name must be of type 'string', 'number', 'symbol', or 'any'. Cannot find name 'P'. Cannot find name 'keyof'. ']' expected. Cannot find name 'T'. Declaration or statement expected. A parameter initializer is only allowed in a function or constructor implementation. Cannot find name 'T'. ']' expected. ')' expected. Declaration or statement expected. Cannot find name 'ConformsPredicateObject'. Cannot find name 'Many'
Package.json:
< "name": "pms", "version": "1.0.0", "scripts": <>, "license": "ISC", "dependencies": < "@angular/common": "^2.4.9", "@angular/compiler": "^2.4.9", "@angular/core": "^2.4.9", "@angular/forms": "^2.4.9", "@angular/http": "^2.4.9", "@angular/platform-browser": "^2.4.9", "@angular/platform-browser-dynamic": "^2.4.9", "@angular/router": "^3.4.9", "@angular/upgrade": "^2.4.9", "core-js": "^2.4.1", "reflect-metadata": "^0.1.10", "rxjs": "^5.2.0", "systemjs": "^0.20.9", "zone.js": "^0.8.0", "lodash": "^4.17.4" >, "devDependencies": < "@types/core-js": "^0.9.37", "typescript": "^2.2.1", "typings": "^2.1.0", "@types/lodash": "^4.14.55" >> 

Solution:

Update @types/lodash in package.json to Typescript 2.0 compatible types in order to use lodash without any issue. Execute the below npm command

> npm install @types/lodash@ts2.0 --save-dev 
Updated Package.json:
< "name": "pms", "version": "1.0.0", "scripts": <>, "license": "ISC", "dependencies": < "@angular/common": "^2.4.9", "@angular/compiler": "^2.4.9", "@angular/core": "^2.4.9", "@angular/forms": "^2.4.9", "@angular/http": "^2.4.9", "@angular/platform-browser": "^2.4.9", "@angular/platform-browser-dynamic": "^2.4.9", "@angular/router": "^3.4.9", "@angular/upgrade": "^2.4.9", "core-js": "^2.4.1", "reflect-metadata": "^0.1.10", "rxjs": "^5.2.0", "systemjs": "^0.20.9", "zone.js": "^0.8.0", "lodash": "^4.17.4" >, "devDependencies": < "@types/core-js": "^0.9.37", "typescript": "^2.2.1", "typings": "^2.1.0", "@types/lodash": "ts2.0" > > 

Источник

Читайте также:  Css задать ширину рамки

Классы и Keyof в Typescript

В общем, нет, нет способа объявить класс или интерфейс, который соответствует интерфейсу или типу, который задан в качестве параметра типа для класса. Смотрите этот вопрос GitHub , все еще открыт. Синтаксис сопоставленного типа [K in keyof . ] . работает только для псевдонимов типов , он не разрешен для классов и интерфейсов .

2 ответа

Сопоставленные типы нельзя использовать в интерфейсах или классах. Они могут использоваться только внутри псевдонима типа.

Наследование интерфейса и класса не очень хорошо сочетается с отображаемыми типами, если используются обобщенные типы. Typescript хочет знать форму базового класса/интерфейса заранее, поэтому пока мы можем написать что-то вроде:

interface Foo extends Pick

interface Foo extends Pick  < //An interface can only extend an object type or intersection of object types with statically known members >

Это исключает любую возможность обмануть компилятор слиянием интерфейса класса.

Единственный обходной путь — определить класс отдельно и использовать собственную подпись конструктора. Сигнатура пользовательского конструктора может иметь параметр общего типа и может использовать его в возвращаемом типе экземпляра. Мы можем сделать возвращаемый тип экземпляром класса Domain в пересечении с T :

type UserType = < id: number, name: string, >class _Domain  < _data: T; constructor(data: T) < this._data = data; Object.keys(data).forEach((key) =>Object.defineProperty(this, key, < get: () =>this._dataCannot find name keyof typescript >)); > > const Domain = _Domain as (< new (data: T): _Domain & T >) const joeData: UserType = < id: 1, name: 'Joe', >const joe = new Domain(joeData); // type: _Domain & UserType console.log(joe.id); 

@leili это потеряет статику (хотя я думаю, что вы можете добавить их обратно, используя Pick ). Вы также теряете некоторую безопасность типов из-за утверждения. Но сам класс должен быть безопасным по типу, а сайты вызовов будут безопасными по типу.

Читайте также:  Кнопка

Я думаю, что теперь есть способ динамически определять свойства класса, как это. Он также не работает в interface . Я попробовал вариант вашего класса с помощью implements Foo и получил эту ошибку:

Класс может реализовывать только тип объекта или пересечение типов объектов со статически известными членами.

Это наводит меня на мысль, что Typescript специально разработан, чтобы избежать динамически заданных свойств класса.

Вы можете сделать это с помощью конструктора, который не является классом. Вы можете использовать свой тип Foo в качестве возвращаемого типа функции, которая создает простой объект с использованием геттеров. Или, если вам нужна только версия объекта для Object.freeze(data) вы можете использовать Object.freeze(data) .

Ещё вопросы

  • 0 Как использовать регулярные выражения в MySQL запрос, чтобы удалить определенные символы?
  • 0 ошибка: ожидаемое первичное выражение до токена ‘
  • 1 Как хранить неживые предметы
  • 0 Angularjs Показаны Загрузка блесны
  • 0 Как восстановить сову карусели на ng-click в angular.js?
  • 1 Почему PageableListView не имеет конструктора без модели или списка
  • 0 выбор ячейки таблицы на основе ее идентификатора с помощью jquery
  • 1 RadioButton выравнивает текст по левой стороне и кнопку вправо
  • 0 ng-change в директиве обновляет модель контроллера позже, затем вызывается метод обратного вызова
  • 0 Сообщение формы PHP внутри iframe не работает
  • 0 AngularFire & Ionic — форма данных не передается на сервер
  • 1 Как я могу использовать наследование в шаблонах Cheetah?
  • 1 FusedLocationProviderClient RemoveLocationUpdatesAsync Задача не выполнена
  • 0 MySQL выбрать с использованием даты и времени, сгруппировать только по дате
  • 1 Преобразуйте значения groupby в список массивов [duplicate]
  • 0 Firebase .push () Ошибка и ng-модель не работает
  • 0 Как использовать $ sce.trustAsHtml с некоторым узлом HTML
  • 0 Сбор продукта и фильтр Magento
  • 1 Crypto JS: TripleDES неправильно шифрует
  • 0 обменивать переменные между страницей виртуальной клавиатуры на другую открытую страницу только в javascript (НЕ Jquery)?
  • 0 JavaScript, если что-то имеет атрибут CSS значения
  • 0 Как проверить поле ввода с помощью php
  • 0 Zip и скачать файлы из каталога и удалить .zip файл после загрузки
  • 1 Свободное отображение частных полей NHibernate
  • 0 $ _SESSION не хранит значения
  • 1 TypeError с помощью json.load () из пакета сборки при развертывании приложения
  • 1 Как не оттолкнуть ImageView от экрана с Long TextView?
  • 0 JQuery Datatable Следующая кнопка работает неправильно
  • 1 Считайте подпапку входящих сообщений с помощью exchangelib
  • 1 Система оценки фигуристов
  • 1 Можно ли выполнить условную сортировку по двум различным столбцам, но где порядок двух столбцов меняется на обратный в зависимости от вторичного условия?
  • 1 Как запустить пакет служб SSIS через .net?
  • 1 Создать массив объекта, когда сканер читает текстовый файл
  • 0 Области применения переменных и объектов в угловых
  • 1 Пытаясь создать код Python для печати электронной почты на веб-сайте с IMAP, localhost не отвечает
  • 1 Можно ли сделать JS-запрос с ограниченной пропускной способностью?
  • 0 Расширение PHP с C. При создании первой среды я получил ошибку синтаксиса awk, используя ext_skel
  • 1 FolderBrowserDialog с MVC 4?
  • 0 Обработчик событий Jquery не работает при вызове со страницы
  • 0 получить все узлы из многоуровневого хэша в Perl
  • 1 Как использовать сеттеры для пользовательского представления в RecyclerView?
  • 0 C ++ возможные комбинации монет с использованием цикла while
  • 0 Соединение AngularJS и CodeIgniter (вызовы GET работают, но POST нет)
  • 1 Почему VisualTreeHelper.GetChildrenCount возвращает 0 элементов управления верхнего уровня?
  • 1 Отображение правильного статуса «Бег» в менеджере tomcat
  • 1 org.hibernate.id.IdentifierGenerationException: при сохранении данных в сопоставлении один в один
  • 1 Twitter Bot — node.js — неожиданная ошибка токена
  • 0 Boost Spirit.Lex ре-лексирование измененных строк с использованием состояния из предыдущей строки
  • 0 Дополнительное пространство под нижним колонтитулом
  • 0 Как заполнить вид сетки данными из базы данных MySQL? (C # UWP)

Источник

Оцените статью