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
}