typescript에서“never 유형의 매개 변수에 지정할 수 없음”오류가 무엇입니까?


162

코드는 다음과 같습니다

const foo = (foo: string) => {
  const result = []
  result.push(foo)
}

다음 TS 오류가 발생합니다.

[ts] 'string'유형의 인수는 'never'유형의 매개 변수에 지정할 수 없습니다.

내가 뭘 잘못하고 있죠? 이것이 버그입니까?

답변:


253

result다음과 같이 문자열 배열로 정의 하면됩니다.

const result : string[] = [];

배열 유형을 정의하지 않으면 기본적으로입니다 never. 따라서 문자열을 추가하려고 할 때 유형이 일치하지 않아서 오류가 발생했습니다.


7
저에게 기괴한 것 같습니다. 왜 기본값 never[]입니까? "항상 비어있는 배열"을 제외하고는 그 용도가 있습니까?
— Vincent Buscarello '28

7
솔직히 말해서 nevers 배열 이 유용 할 유스 케이스를 생각할 수 없기 때문에 전적으로 동의 합니다. 그러나 그것을 조사하는 동안 나는 훌륭한 정보를 가진 이 대답 을 발견했습니다 .
— Tha'er M. Al-Ajlouni

9
기본 유형이 "any"가 아니어야합니까? 변수 ( let x;) 를 선언하면 any기본적 으로 유형 입니다. 아닙니다 never.
— Shachar Har-Shuv

1
확실히 유형이없는 배열은입니다 any[]. never[]그것이 쓸모 없게 만드는 것이 놀랐습니다 . 직관적이지 않습니다. 답변 해주셔서 감사합니다. 편집 : 문법
— Igor Malyk

4
@VincentBuscarello 그런 기본값의 요점은 항상 배열에 유형을 추가하는 것입니다. 그러나 오류 메시지는 확실히 도움이되지 않습니다.
— YakovL

28

다른 방법은 다음과 같습니다.

const result = [] as  any;

8
실제로 anyTypeScript 기능을 해제하기 때문에 실제로 사용하는 것은 좋지 않습니다. 해결 방법이며 다양한 버그로 이어질 수 있습니다.
— Tomek Buszewski

1
예. 그러나 타사 라이브러리로 작업 할 때 특히 다른 방법은 없습니다 ..
— neomib

14

이것은 최근 회귀 또는 타이프 스크립트의 이상한 동작 인 것 같습니다. 코드가있는 경우 :

const result = []

일반적으로 다음과 같이 쓴 것처럼 취급됩니다.

const result:any[] = []

그러나 tsconfig에 noImplicitAnyFALSE 와 strictNullChecks TRUE 가 모두 있으면 다음 과 같이 처리됩니다.

const result:never[] = []

이 동작은 모든 논리 IMHO를 무시합니다. null 검사를 켜면 배열의 항목 유형이 변경됩니까 ?? 그런 다음 noImplicitAny실제로 켜면 any경고없이 사용이 복원됩니다 ??

의 배열이 any있으면 추가 코드로 표시하지 않아도됩니다.


10

ReactJs Hook useState 를 사용하는 동안 ReactJS statless 함수에서 동일한 오류가 발생 했습니다 . 객체 배열의 상태를 설정하고 싶었으므로 다음과 같은 방법을 사용하면

const [items , setItems] = useState([]);

다음과 같이 상태를 업데이트하십시오.

 const item = { id : new Date().getTime() , text : 'New Text' };
 setItems([ item , ...items ]);

오류가 발생했습니다 :

'{id : number; text : any} '는'never '유형의 매개 변수에 지정할 수 없습니다.

하지만 이렇게하면

const [items , setItems] = useState([{}]);

오류는 사라졌지 만 0 인덱스에 데이터가없는 항목 이 있습니다 (원치 않는).

그래서 내가 찾은 해결책은 다음과 같습니다.

const [items , setItems] = useState([] as any);

7

ReactJS useState 후크를 사용하여 ReactJS 함수 구성 요소에서 동일한 오류가 발생했습니다. 해결책은 초기화시 useState 유형을 선언하는 것이 었습니다.

const [items , setItems] = useState<IItem[]>([]); // replace IItem[] with your own typing: string, boolean...

3

빈 대괄호 대신 Array 키워드를 사용 하여이 문제를 해결할 수있었습니다.

const enhancers: Array<any> = [];

사용하다:

if (typeof devToolsExtension === 'function') {
  enhancers.push(devToolsExtension())
}

2

resultstring 형 배열 을 입력해야 합니다 const result: string[] = [];.



1

"compilerOptions" 에서 "strictNullChecks": true 를 제거 하거나 Ng 앱 의 tsconfig.json 파일 에서 false로 설정하십시오 . 이러한 오류는 다른 것처럼 사라지고 앱이 성공적으로 컴파일됩니다.

면책 조항 : 이것은 단지 해결 방법입니다. 이 오류는 null 검사가 제대로 처리되지 않은 경우에만 나타나며, 어떤 경우에도 작업을 수행하기에 좋은 방법은 아닙니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.