Type of emit value is always 'any' with new style defineEmits

2024. 3. 27. 23:51· Typescript
목차
  1. 1. 타입 정의 X
  2. 2. 인터페이스 사용
  3. 3. Type 사용
728x90

Emit 이벤트를 통해 전달한 value의 값이 항상 any이기 때문에 발생하는 타입 오류를 해결하기 위해 고민한 흔적~^^

 

아래에서는 단계적으로 정리해뒀다.

 


1. 타입 정의 X

const emit = defineEmits(['update:value']);

const setSelectedValue = (value) => {
  emit('update:value', value);
};

 

이때 value의 타입은 따로 명시해주지 않았기 때문에 any이다.

근데 이 경우 공통 컴포넌트를 앱에 전역 등록해주면, vue 파일에서 emit 이벤트를 받아서 변수를 업데이트해 줄 때,

@update:value="(value) => props.row.data.volType = value"

 

이런 TypeError가 나타난다.

Parameter 'value' implicitly has an 'any' type.

 

 

 


2. 인터페이스 사용

인터페이스를 정의하여 value에 적절한 타입을 명시해줬다. 

interface Cascade {
  dtlCd: string
  dtlNm: string
  isCascade: boolean
}

interface emitType {
  'update:value': (value: Cascade) => void;
}

const emit = defineEmits<emitType>();

 

Record<string, any[]> 제한을 맞춰야 한다며 별 트집을 다 잡는다.

 

Type 'emitType' does not satisfy the constraint 'Record<string, any[]> | ((...args: any[]) => any)'.
Type 'emitType' is not assignable to type 'Record<string, any[]>'.
Index signature for type 'string' is missing in type 'emitType'.

 

 

https://github.com/microsoft/TypeScript/issues/42825

Types declared as an "interface" do not extend Record<PropertyKey, unknown>

인터페이스 사용 시 발생하는 버그인 것 같다. 최신 버전에서는 고친 것 같은데 난 아직 3.3 버전을 쓰고 있으니 사용할 수 없을 것 같다.

 


 

3. Type 사용

type emitType = {
  'update:value': [value: cascadeT];
};

const emit = defineEmits<emitType>();

const selectedValue = computed(() => props.value);

const setSelectedValue = (value: cascadeT) => {
  emit('update:value', value);
};

 

뭐 타입은 다 잘 적용이 됐다.

다만 내가 해결하고 싶던 상위 컴포넌트에서 emit 이벤트를 통해 전달받는 value의 타입이 any로 되는 것은 막지 못했다.

 

대체 왜….????!!!! 지긋지긋한 any…

 

 

 

 


[ 참고 자료 ]

https://github.com/vuejs/language-tools/issues/3223

728x90

'Typescript' 카테고리의 다른 글

인덱스 시그니처  (0) 2024.05.14
Element implicitly has an 'any' type because expression of type 'string' can't be used to index type  (0) 2024.03.27
Typescript 인터페이스 네이밍 규칙 어떻게 할까? | 접두사 I를 사용하면 안 되는 이유  (1) 2024.03.27
@input event의 타입  (0) 2024.03.27
타입스크립트 인터페이스 어떻게 선언할까? declare / export  (0) 2024.03.27
  1. 1. 타입 정의 X
  2. 2. 인터페이스 사용
  3. 3. Type 사용
'Typescript' 카테고리의 다른 글
  • 인덱스 시그니처
  • Element implicitly has an 'any' type because expression of type 'string' can't be used to index type
  • Typescript 인터페이스 네이밍 규칙 어떻게 할까? | 접두사 I를 사용하면 안 되는 이유
  • @input event의 타입
ZoD
ZoD
바쁘게 굴러가는 ZoD의 하루~
ZoD
como siempre
ZoD
  • 분류 전체보기 (173)
    • Daily (0)
    • Javascript (16)
      • 모던 자바스크립트 (46)
    • Typescript (8)
    • FrontEnd (7)
    • React (21)
      • tanstack query (1)
      • 라이브러리 (3)
    • Vue (33)
      • Nuxt (11)
      • Quasar (6)
    • CSS (12)
    • Storybook (8)
    • Figma (3)
    • CS 지식 (5)
    • Network (5)
    • 알고리즘 (2)
    • 사이드 프로젝트 (4)
      • ddangkong (4)
      • boncierge (0)
    • 개발, 근데 이제 헛소리를 곁들인 (1)
    • ETC (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

최근 글

hELLO · Designed By 정상우.v4.2.2
ZoD
Type of emit value is always 'any' with new style defineEmits
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.