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

코드는 다음과 같습니다

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

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

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

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



답변

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

const result : string[] = [];

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


답변

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

const result = [] as  any;


답변

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

const result = []

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

const result:any[] = []

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

const result:never[] = []

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

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


답변

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);


답변

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

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


답변

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

const enhancers: Array<any> = [];

사용하다:

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


답변

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