Почему я получаю сообщение об ошибке? Объектный литерал может указывать только известные свойства?

Я только что обновил от TypeScript 1.5 до последней версии, и я вижу ошибку в моем коде:

interface Options { /* ... others ... */ callbackOnLocationHash?: boolean; } function f(opts: Options) { /* ... */ } // Error: Object literal may only specify known properties, // and 'callbackOnLoactionHash'does not exist in type 'Options'. f( { callbackOnLoactionHash: false }); 

Код выглядит хорошо для меня. Что не так?

(Альтернативная версия юниверса: я распознаю опечатку, и я действительно хотел это написать. Что мне нужно сделать, чтобы удалить ошибку?)

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

Обычно эта ошибка означает, что у вас есть ошибка (как правило, опечатка) в коде или в файле определения. Правильным решением в этом случае было бы исправление опечатки. В вопросе свойство callbackOnLoactionHash неверно и должно было быть callbackOnLocationHash (обратите внимание на неправильное написание «Местоположение»).

Это изменение также потребовало некоторых обновлений в файлах определений, поэтому вы должны получить последнюю версию .d.ts для любых библиотек, которые вы используете.

Пример:

 interface TextOptions { alignment?: string; color?: string; padding?: number; } function drawText(opts: TextOptions) { ... } drawText({ align: 'center' }); // Error, no property 'align' in 'TextOptions' 

Но я хотел сделать это

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

Проверка типов только некоторых свойств

Иногда вы хотите убедиться, что несколько вещей присутствуют и имеют правильный тип, но намерены иметь дополнительные свойства по любой причине. Утверждения типа ( v или v as T ) не проверяют дополнительные свойства, поэтому вы можете использовать их вместо annotations типа:

 interface Options { x?: string; y?: number; } // Error, no property 'z' in 'Options' let q1: Options = { x: 'foo', y: 32, z: 100 }; // OK let q2 = { x: 'foo', y: 32, z: 100 }; // Still an error (good): let q3 = { x: 100, y: 32, z: 100 }; 

Эти свойства и, возможно, больше

Некоторые API-интерфейсы берут объект и динамически перебирают его ключи, но имеют специальные клавиши, которые должны быть определенного типа. Добавление индекса индекса в тип отключит дополнительную проверку свойств

До

 interface Model { name: string; } function createModel(x: Model) { ... } // Error createModel({name: 'hello', length: 100}); 

После

 interface Model { name: string; [others: string]: any; } function createModel(x: Model) { ... } // OK createModel({name: 'hello', length: 100}); 

Это собака или кошка или лошадь, пока не уверен

 interface Animal { move; } interface Dog extends Animal { woof; } interface Cat extends Animal { meow; } interface Horse extends Animal { neigh; } let x: Animal; if(...) { x = { move: 'doggy paddle', woof: 'bark' }; } else if(...) { x = { move: 'catwalk', meow: 'mrar' }; } else { x = { move: 'gallop', neigh: 'wilbur' }; } 

Здесь приходят два хороших решения

Задайте замкнутое множество для x

 // Removes all errors let x: Dog|Cat|Horse; 

или Тип утверждают каждую вещь

 // For each initialization x = { move: 'doggy paddle', woof: 'bark' }; 

Этот тип иногда открыт, а иногда и не

Чистое решение проблемы «модели данных» с использованием типов пересечений:

 interface DataModelOptions { name?: string; id?: number; } interface UserProperties { [key: string]: any; } function createDataModel(model: DataModelOptions & UserProperties) { /* ... */ } // findDataModel can only look up by name or id function findDataModel(model: DataModelOptions) { /* ... */ } // OK createDataModel({name: 'my model', favoriteAnimal: 'cat' }); // Error, 'ID' is not correct (should be 'id') findDataModel({ ID: 32 }); 

См. Также https://github.com/Microsoft/TypeScript/issues/3755

  • Преобразование типа объединения в тип пересечения
  • Typcript - расширение classа ошибок
  • Использование плагина jQuery в TypeScript
  • TypeScript Преобразование строки в число
  • получить и установить в TypeScript
  • Внедрение интерфейса TypeScript с сигнатурой голосовой функции и другими полями
  • Вызов глобальной переменной внутри модуля Typcript
  • Как программно перечислять тип enums в TypeScript 0.9.5?
  • TypeScript any vs Object
  • Импорт узлов-модhive с помощью TypeScript
  • nodejs требуется внутри файла TypeScript
  • Interesting Posts

    Как я могу определить, какую именно версию сервера Exchange я подключаю к Outlook?

    Mac OS X: лучший способ сделать ISO с компакт-диска или DVD-диска

    Хостинг WebAPI с использованием OWIN в службе Windows

    Как я могу изменить проверку орфографии и язык автоматической коррекции IE10 / Windows8?

    Что означают программисты, когда говорят: «Код против интерфейса, а не объект»?

    Как реализовать приоритезацию задач с помощью ExecutorService в Java 5?

    Как объединить несколько файлов в один?

    «Не удалось настроить» цикл перезагрузки с обновлениями Windows 7

    Загрузка изображений из фоновой темы с использованием блоков

    OS X: Можно ли поместить обычный текст по умолчанию?

    Можно ли «мгновенно» создавать произвольные файлы?

    Создание всех комбинаций из нескольких списков

    Нулевое объединение в PowerShell

    Как подождать в bash для нескольких subprocessов, чтобы закончить и вернуть код выхода! = 0, когда какой-либо subprocess заканчивается кодом! = 0?

    Redshift. Преобразование значений, разделенных запятыми в строки

    Давайте будем гением компьютера.