해결된 질문
작성
·
305
·
수정됨
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 객체로 만들어주니 에러가 납니다.
string 이 "a" | "b" 에 할당 가능하지 않다?? 그러면 as const를 안붙일때도 불가능 해야하지 않나요?
답변 1
0
객체는 const여도 수정 가능합니다.
as const를 붙이면 객체를 수정하지 않겠다는 뜻입니다.
그러면 param은 'a' | 'b'만 가능하죠.
as const를 떼면 객체를 수정할 수도 있으니 param은 넓은 string 타입이 됩니다.
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;
}
애시당초 searchElement의 타입의 제네릭이 맞지 않아 일어나는 일이었군요. 정말 감사합니다. array.includes의 타입 선언 파일을 빨리 뜯어봤어야 하는 것이었네요.
강의 초반에 타입스크립트가 일종의 해당 코드에 대한 설명서라는 이야기를 하셨는데 참 와닿습니다. 항상 큰 도움 받습니다. 감사합니다.
as const를 붙이면 객체를 수정하지 않겠다는 뜻입니다.
그러면 param은 'a'|'b' 만 가능하죠.
이 두 문장 사이의 논리가 궁금합니다.
저는 param에 string을 넣었는데 왜 param이 "a"| "b" 가 되어야 하나요?
그것이 아니라면 제가 array.prototype.includes를 잘못 사용하고 있는 것 인가요?