Universal and better typed hasOwnProperty
for better IntelliSense - code hinting. Supports checking: properties of all types; multiple keys at a time; and optionally checks if the value(s) belongs to the specified type.
RU: Универсальный и более типизированный аналог hasOwnProperty
для улучшения подсказок при работе в IDE-шках (редакторах кода). Также, метод поддерживает проверку свойств всех типов данных, позволяет перечислить сразу несколько ключей, опционально можно задать проверку на тип значения, а также корректно работает с коллекциями, созданными через Object.create(null)
.
- Do not use
any
type, please.- Use
unknown
if you thing aboutany
.- If you working with third party module and have to suffer from
any
, sots-has-property
may be very useful, may-be...
- Installing / Установка
- Usage / Использование
- Demo / Демонстрация
- Note / Замечание
- Author / Автор
- License / Лицензия
yarn add ts-has-property -T
or, if you prefer npm
:
npm i ts-has-property -E
EN:
SemVer
is not guaranteed;
RU: СоблюдениеSemVer
не гарантируется.
Function arguments / Аргументы функции:
- the value to inspect / проверяемый элемент
- the key to check / искомый ключ
import hasProperty from 'ts-has-property';
const data = anyThing(/* ... */);
if (hasProperty(data, 'someKey')) {
data.someKey; // <- 100% exists
// @see "Demo / Демонстрация" section
}
EN: If 1st argument is not an object =>
false
; tsc will inform you about typing errors if possible. @see Note.
RU: Если первым аргументом передан не объект, то функция вернётfalse
; tsc сообщит об ошибке, если сможет проверить тип передаваемого значения до рантайма. Подробнее: см. Замечание.
EN: Unlike the first version, all types are now supported as the first argument.
RU: С данной версии, проверяются свойства любого значения, передаваемого первым аргументом.
[ℹ️]:
any
=== 👎 &&unknown
=== 👍
EN: If you only need non-null
/undefined
property, there is shortcut for you, see listing below;
RU: В обычном режиме проверяется только наличие ключа, однако, если его значение может быть undefined
или null
, то в большинстве условиях потребуется дополнительная проверка для осуществления дальнейшего чейнинга значения. Поэтому, в функции предусмотрен шорткат, позволяющий проверить свойство на нененулевое значение:
const data: {
title: string;
description?: string; // string | undefined
// ...
} = getData(/* ... */);
data.description = undefined; // - `data` has property `description`
if (
hasProperty(data, 'description', true) // 👈 `true`
) {
// ...
console.log(data.description.toString());
} else {
console.log(`Data's own property 'description' has no value`);
}
[ℹ️]:
any
=== 👎 &&unknown
=== 👍
EN: If we have a value that has a union type
, but only a certain one is required, there is a shortcut - 3rd argument, see listing below;
RU: Если значение свойства может принадлежать одному из нескольких типов, а требуется только определённый, то и на этот случай имеется шорткат:
const data: Record< // - object
string, // - type of key
number | Array<number> // - type of value
> = getData(/* ... */);
const sum = hasProperty(data, 'key', 'array') // 👈 `'array'`
? data.key.reduce((prev, cur) => prev + cur) // `data.key: Array<number>`
: data.key // `data.key: number`
Possible argument values / Возможные значения:
'boolean'
'string'
'number'
'object'
'array'
One more example
const data: Record< // - object
string, // - type of key
'some' | 'union' | 'types' | 27 | 13 // - type of value
> = getData(/* ... */);
if (hasProperty(data, 'key', 'string')) {
data.key; // `data.key: 'some' | 'union' | 'types'`
}
@see gif demo
const data: Array<number | string> = [];
if (hasProperty(data, 27, 'number')) {
const thisNumber = data[27]; // `data[27]: number`
}
if (hasProperty(data, 0, 'array')) { // type error,
// Array `data: Array<number | string>` has no `Array` items
}
@see demo (2nd gif)
Не обязательно явной строкой указывать название ключа, как это демонстрируется в gif-ке, ключ также может храниться в
const
-те илиenum
-е. Главное, чтобы IDE была точно уверенна в содержимом передаваемого параметра.
const obj: {
[key: string]: Array<string>,
} = {};
enum Keys {
sth = 'something',
}
if (hasProperty(obj, Keys.sth)) {
obj./* IDE: something */; // см. изображение ниже
}
// ...
if (hasProperty(obj, ['someKey', 'yetAnotherKey'])) {
obj./* IDE: */;
/* someKey */
/* yetAnotherKey */
}
For versions 1.*.* only
EN: hasProperty
checks if 1st argument is a 'plain' object.
RU: Данная функция проверяет, является ли первый аргумент - обычным объектом.
Said Magomedov - GitHub // NPM // VK
EN: This project is licensed under the MIT License.
RU: Данный проект распространяется по MIT License.