Почему я получаю сообщение об ошибке? Объектный литерал может указывать только известные свойства?
Я только что обновил от 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 });
Код выглядит хорошо для меня. Что не так?
(Альтернативная версия юниверса: я распознаю опечатку, и я действительно хотел это написать. Что мне нужно сделать, чтобы удалить ошибку?)
- Как использовать jQuery с TypeScript
- Что такое знак вопроса в имени параметра Typcript
- Когда я обновляю свой сайт, я получаю 404. Это с Angular2 и firebase
- Значение свойства по умолчанию в компоненте React с использованием TypeScript
- Сбивание «дубликата идентификатора»
- Создайте перечисление со строковыми значениями в TypeScript
- Как предотвратить ошибку? Подпись индекса типа объекта неявно имеет тип «any» при компиляции машинописных файлов с флагом noImplicitAny?
- Как устранить ошибку TypeScript TS2533: возможно, объект «null» или «undefined»?
- Как сделать объект JSON classом типов
- Инициализаторы типа TypeScript и поля
- angular2 resolveAndCreate HTTP - отсутствует HTTP_PROVIDERS в RC7
- Как инициализировать объект TypeScript с помощью объекта JSON
- Как получить имена записей enums TypeScript?
Начиная с 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 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