Skip to main content

contains

첫 번째 인자로 넘긴 배열에 특정 요소가 포함되어 있는지 판단하는 유틸 함수입니다.

includes는 as const를 활용 했을 때, 타입이 호환되지 않은 요소가 포함되어 있는지 확인 할 때 타입 에러가 발생하는 문제점을 some 메서드를 활용해 개선한 함수입니다.

typescript
const test = (value: number) => {
const arr = [1, 2, 3, 4] as const;
arr.includes(value); // 'number' 형식의 인수는 '1 | 2 | 3 | 4' 형식의 매개 변수에 할당될 수 없습니다.
};

some 메서드를 통해 요소가 포함되어 있는지 판단 할 때 기본적으로 Object.is 메서드를 활용합니다. 단, 필요 시에 3번째 인자로 comparator 함수를 활용 할 수 있습니다.

Object.is를 활용한 이유는 == 보다는 엄격하게 관리되며, ===보다 조금 더 개발자가 기대하는 결과를 가져옵니다. 예를 들어 ===과 비교했을 때, NaN은 같다고 판단하며, -0과 +0은 서로 다르다고 판단합니다.

typescript
-0 === +0 // true
Object.is(-0, +0); // false

NaN === NaN; // false;
Object.is(NaN, NaN); // true
Object.is(NaN, 0 / 0); // true

Code

🔗 실제 구현 코드 확인

Interface

typescript
function contains<T>(
arr: T[] | readonly T[],
value: unknown,
comparator?: (x: any, y: any) => boolean
): value is T;

Usage

Default

typescript
import { contains } from '@modern-kit/utils';

const arr = [0, 1, 2, 3, NaN, {}];

contains(arr, 1); // true
contains(arr, NaN); // true

contains(arr, -0); // false
contains(arr, 4); // false
contains(arr, "3"); // false
contains(arr, {}); // false

Comparator

typescript
const arr = [{ a: 1, b: 2 }];

contains(arr, { a: 1, c: 2 }, (x, y) => x.a === y.a); // true
contains(
arr,
{ a: 1, b: 2 },
(x, y) => JSON.stringify(x) === JSON.stringify(y)
); // true

Narrowing types

typescript
const arr = [2, 3, 'foo'] as const;
const value = 'foo' as unknown;

if (contains(arr, value)) {
value; // 2 | 3 | 'foo'
} else {
value; // unknown
}

Note