• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

as const 를 붙여서 readonly된 객체의 타입

22.12.20 17:30 작성 22.12.20 17:33 수정 조회수 220

1

const obj = {
    A: "a",
    B: "b"
}

function isInclude (param: string) {
    if(Object.values(obj).includes(param)){
        return true
    }
    return false
}

isInclude 함수의 매개변수가

(obj의 value 값 배열인) ["a", "b"] 에 포함이 될 때 true를 반환하고,

그렇지 않을때는 false를 반환하는 함수 입니다.

func("a"); // true
func("b"); // true
func("c"); // false

그런데!!!

const obj = {
    A: "a",
    B: "b"
} as const

function isInclude (param: string) {
    if(Object.values(obj).includes(param)){
        return true
    }
    return false
}

`obj` 객체를 as const로 readonly 객체로 만들어주니 에러가 납니다.

as const질문.pngstring 이 "a" | "b" 에 할당 가능하지 않다?? 그러면 as const를 안붙일때도 불가능 해야하지 않나요?

답변 1

답변을 작성해보세요.

0

객체는 const여도 수정 가능합니다.

as const를 붙이면 객체를 수정하지 않겠다는 뜻입니다.

그러면 param은 'a' | 'b'만 가능하죠.

as const를 떼면 객체를 수정할 수도 있으니 param은 넓은 string 타입이 됩니다.

as const를 붙이면 객체를 수정하지 않겠다는 뜻입니다.
그러면 param은 'a'|'b' 만 가능하죠.

 

이 두 문장 사이의 논리가 궁금합니다.

저는 param에 string을 넣었는데 왜 param이 "a"| "b" 가 되어야 하나요?

그것이 아니라면 제가 array.prototype.includes를 잘못 사용하고 있는 것 인가요?

Object.values(obj)는 'a' | 'b'로 고정됩니다. ['a', 'b'].includes('c')는 의미가 없죠. 어차피 false니까요. 그래서 param은 string같이 넓으면 안 되고 'a' | 'b'만 됩니다.

 

interface Array<T> {
    /**
     * Determines whether an array includes a certain element, returning true or false as appropriate.
     * @param searchElement The element to search for.
     * @param fromIndex The position in this array at which to begin searching for searchElement.
     */
    includes(searchElement: T, fromIndex?: number): boolean;
}

타이브크립트에서 애초에 (['a', 'b'] as const).includes('c') 같이 무조건 false인 상황을 불가능하게끔 타이핑해놨습니다.

애시당초 searchElement의 타입의 제네릭이 맞지 않아 일어나는 일이었군요. 정말 감사합니다. array.includes의 타입 선언 파일을 빨리 뜯어봤어야 하는 것이었네요.

강의 초반에 타입스크립트가 일종의 해당 코드에 대한 설명서라는 이야기를 하셨는데 참 와닿습니다. 항상 큰 도움 받습니다. 감사합니다.