yield로 내놓는 값의 타입이 맞지 않아요

yield로 내놓는 값의 타입이 맞지 않아요

생성기 함수(sync*async*로 표시된 함수)는 Iterable이나 Stream을 반환하는데요, yield로 내놓는 값의 타입과 그 생성기가 반환하기로 한 타입이 서로 맞아야 해요. 만약 타입이 안 맞으면 분석기가 이 진단을 내보내요. yield*로 다른 컬렉션을 펼칠 때도 그 값들의 타입이 반환 타입에 맞아야 하구요.

출처: A yielded value of type '{0}' must be assignable to '{1}'

본문

분석기는 yield 또는 yield* 표현식이 만들어내는 객체의 타입이, 생성기(즉 sync*async* 중 하나로 표시된 함수나 메서드)가 반환하는 Iterable 또는 Stream 타입에서 돌려줘야 하는 객체들의 타입과 일치하지 않을 때 이 진단을 만들어요.

예시

아래 코드는 getter zero가 정수를 반환하는 Iterable을 반환하도록 선언됐는데, yield가 iterable에서 문자열을 반환하고 있어서 이 진단이 발생해요.

Iterable<int> get zero sync* {
  yield '0';
}

흔한 해결 방법

함수의 반환 타입이 올바르다면, yield 키워드 뒤의 표현식을 올바른 타입을 반환하도록 고치면 돼요.

Iterable<int> get zero sync* {
  yield 0;
}

반대로 yield 뒤의 표현식이 올바르다면, 함수의 반환 타입을 그 값을 허용하도록 바꿔 주면 돼요.

Iterable<String> get zero sync* {
  yield '0';
}

더 알아보기