kakasoo

오버로딩에서 코드 자동 완성 기능이 오작동하는 경우 본문

프로그래밍/regexp-manager

오버로딩에서 코드 자동 완성 기능이 오작동하는 경우

카카수(kakasoo) 2023. 1. 24. 21:22
반응형
findOne<T extends string, U extends string, V extends number, W extends number>({
    from,
    include,
    lessThanEqual,
    moreThanEqual,
}: {
    from: T;
    include: IncludeType<U, true>;
    lessThanEqual: V;
    moreThanEqual: W;
}): ExecutionComparison<ExcutionIncludeForehead<T, U>, W, V>;

findOne<T extends string, U extends string, V extends number, W extends number>({
    from,
    include,
    lessThanEqual,
    moreThanEqual,
}: {
    from: T;
    include: IncludeType<U, false>;
    lessThanEqual: V;
    moreThanEqual: W;
}): ExecutionComparison<ExcutionIncludeBehind<T, U>, W, V>;

findOne<T extends string, V extends number, W extends number>({
    from,
    lessThanEqual,
    moreThanEqual,
}: {
    from: T;
    lessThanEqual: V;
    moreThanEqual: W;
}): ExecutionComparison<T, W, V>;

findOne<T extends string, U extends string>({
    from,
    include,
}: {
    from: T;
    include: IncludeType<U, true>;
}): ExcutionIncludeForehead<T, U>;

findOne<T extends string, U extends string>({
    from,
    include,
}: {
    from: T;
    include: IncludeType<U, false>;
}): ExcutionIncludeBehind<T, U>;
findOne<T extends string>({ from }: { from: T }): `${T}`;

/**
 *
 * @param {findOneParameterType} param0
 * @returns pattern is type-safe
 */
findOne<T extends string, foreheadOrBehind extends boolean, U extends string, V extends number, W extends number>({
    from,
    include,
    lessThanEqual,
    moreThanEqual,
}: {
    from: T;
    include?: IncludeType<U, foreheadOrBehind>;
    lessThanEqual?: V;
    moreThanEqual?: W;
}) {
    let expression: string = from;
    if (include) {
        if (!include.options) {
            include.options = { isForehead: true } as any;
        }

        if (typeof include.options?.isForehead === 'undefined') {
            include.options.isForehead = true as any;
        }

        if (include.options.isForehead) {
            expression = this.excuteIncludeStatement(expression, include.partial, { isForehead: true });
        } else {
            expression = this.excuteIncludeStatement(expression, include.partial, { isForehead: false });
        }
    }

    if (lessThanEqual || moreThanEqual) {
        expression = this.executeMoreOrLessThanEqual(expression, lessThanEqual, moreThanEqual);
    }

    return expression;
}

 

대부분은 파라미터 단위로 잘리기 때문에 정확하게 추론이 되지만, 동일한 파라미터에서 기본 값에 의한 경우는 오작동할 수 있다.

가령 boolean, true, false를 파라미터로 받는다고 가정할 때, boolean은 true와 false의 응답 타입을 유니온 타입으로 갖게 된다.

하지만 boolean 타입 파라미터의 기본 타입을 true로 지정해도 오작동할 수 있다.

이 경우에는 작성된 함수 오버로딩의 순서가, 위에 작성된 것을 따라가기 때문에 발생하는 것으로 보인다.

오버로딩된 함수 스펙의 순서를 바꿔줌으로써 해결할 수 있으니, 문제가 발생할 경우 이것부터 시도해보는 것이 좋아 보인다.

반응형