본문 바로가기

개발하자

TypeScript에서 "not assignable to parameter of type never" 오류는 무엇인가?

반응형

TypeScript에서 "not assignable to parameter of type never" 오류는 무엇인가?

코드는:

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

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

[ts] Argument of type 'string' is not assignable to parameter of type 'never'.

내가 뭘 잘못하고 있는 거지? 이거 벌레야?




다음과 같이 문자열 배열로 정의하기만 하면 됩니다:

const result : string[] = [];

배열 유형을 정의하지 않으면 기본적으로 다음과 같습니다. 그래서 문자열을 추가하려고 하면 유형 불일치가 발생하여 표시된 오류를 던집니다.




문자열 배열에 입력해야 합니다.




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

const result: any[] = [];



이것은 그들이 유산을 이유로 고수하고 있는 활자판에서 어떤 이상한 행동으로 보인다. 코드가 있는 경우:

const result = []

보통은 다음과 같이 적는 것처럼 취급됩니다:

const result:any[] = []

그러나 tsconfig에 FALSE, TRUE가 둘 다 있는 경우 다음과 같이 처리됩니다:

const result:never[] = []

이런 행동은 모든 논리를 무시해요, IMHO. null 검사를 설정하면 배열의 항목 유형이 변경됩니다?? 그런 다음 전원을 켜면 경고 없이 의 사용이 실제로 복구됩니다??

배열이 실제로 있는 경우 추가 코드를 사용하여 표시할 필요가 없습니다.




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

const enhancers: Array<any> = [];

용도:

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



ReactJs Hook을 사용하는 동안 statless function에서 같은 오류가 발생했습니다. 객체 배열의 상태를 설정하고 싶었기 때문에 다음과 같습니다

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

상태를 다음과 같이 업데이트합니다:

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

오류가 발생했습니다:

이렇게 하면,

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

오류는 사라졌지만 데이터가 없는 항목이 있습니다(그것을 원하지 않음).

그래서 제가 찾은 해결책은 다음과 같습니다:

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



Ng 앱의 파일에서 제거하거나 false로 설정합니다. 이러한 오류들은 다른 것처럼 사라질 것이고 당신의 앱은 성공적으로 컴파일될 것이다.

: 이것은 단지 해결책일 뿐이다. 이 오류는 Null 검사가 제대로 처리되지 않을 때만 나타납니다. 이 오류는 어떤 경우에도 작업을 수행하는 데 좋은 방법이 아닙니다.




useState hook을 사용한 React 함수 구성요소에서도 동일한 오류가 발생하였습니다.

해결책은 각 괄호를 사용하여 초기화 시 사용 상태 유형을 선언하는 것이었다:

// Example: type of useState is an array of string
const [items , setItems] = useState<string[]>([]); 



내가 찾은 해결책은

const [files, setFiles] = useState([] as any);



해결책: 예를 들어 연결 기능을 useSelector hook으로 대체할 수 있는 옵션이 있어서 별로 탐색하지 못했습니다

/* Comp.tsx */
interface IComp {
 a: number
}

const Comp = ({a}:IComp) => <div>{a}</div>

/* ** 

below line is culprit, you are exporting default the return 
value of Connect and there is no types added to that return
value of that connect()(Comp) 

** */

export default connect()(Comp)


--
/* App.tsx */
const App = () => {
/**  below line gives same error 
[ts] Argument of type 'number' is not assignable to 
parameter of type 'never' */
 return <Comp a={3} />
}



오류: 'any' 유형의 인수를 'never' 유형의 매개 변수에 할당할 수 없습니다.

Intsconfig.json -

  "noImplicitReturns": false,

   "strictNullChecks":false,

enter image description here

해결책: '없음'으로 입력

enter image description here




당신은 또한 추가할 수 있다

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

물건의 일부일 때 한거야

let complexObj = {
arrData : [],
anotherKey: anotherValue
...
}
(arrData as string[]).push('text')



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

반환 형식이 의 배열이므로 배열을 지정해야 합니다. 일반적으로 마이크로소프트에 따르면 타입은 "탈출 해치"로 사용되도록 되어 있기 때문에 이를 피하기를 원한다.

결과는 의 배열인 객체이다.




최신 버전의 angular에서는 변수의 유형을 정의해야 합니다:

  1. 문자열일 경우 다음과 같이 해야 합니다:

    공용 메시지: 문자열 ="";

  2. 숫자인 경우:

    public n : number=0;

  3. 문자열 테이블인 경우:

    공용 탭: 문자열[] = [];

  4. 만약 숫자표:

    공용 탭: 번호[]=[];

  5. 혼합 테이블인 경우:

    공용 탭: any[] = [];......... 등(다른 유형의 변수인 경우)

  6. 변수 유형을 정의하지 않으면 기본적으로 유형은 never입니다

NB: 고객님의 경우, 표에 포함되어야 하는 변수의 유형을 알고 있어야 하며, 올바른 옵션(옵션 3,45)을 선택해야 합니다.




배열을 정의(초기화)할 때 다음과 같은 오류가 발생했습니다:

let mainMenu: menuObjectInterface[] | [] = [];

내가 받은 문제의 코드는:

let mainMenu: menuObjectInterface[] | [] = [];
dbresult.rows.forEach((m) => {
    if (!mainMenu.find((e) => e.menucode === m.menucode)) {
        // Not found in mainMenu, yet
        mainMenu.push({menucode: m.menucode, menudescription: m.menudescription})  // Here the error
    }
})

오류: TS2322: '아무것이나' 유형을 '절대' 유형에 할당할 수 없습니다

그 이유는 배열이 빈 배열 옵션과 함께 초기화되었기 때문이다. 타이프스크립트에는 비어 있을 수도 있는 유형에 대한 푸시가 있었다. 따라서 오류가 발생했습니다.

라인을 이로 변경하면 오류가 수정됩니다:

let mainMenu: menuObjectInterface[] = [];



이 오류는 개체의 속성을 설정하지 않은 경우 개체의 속성 값을 설정할 때 발생합니다. 속성을 가진 개체에 대한 유형을 선언한 다음 개체를 인스턴스화할 때 유형을 할당합니다. 이제 이 오류 없이 속성의 값을 설정할 수 있습니다.




사용에 대한 오류가 있었습니다Ref

오류가 발생하기 전에:

const revealRefs = useRef([]);

  const addToRefs = (el) => {
    if (el && !revealRefs.current.includes(el)) {
      revealRefs.current.push(el);
    }
  };

오류 없이 다음과 같이 처리합니다:

const revealRefs = useRef<HTMLElement[]>([]);

  const addToRefs = (el: HTMLElement | null) => {
    if (el && !revealRefs.current.includes(el)) {
      revealRefs.current.push(el);
    }
  };



타이프스크립트 지원을 위한 Vue 3 앱에서는 다음과 같이 정의할 수 있다:

const result = ref<string[]>([]);

const foo = (foo:string)=>{
    result.value.push(foo as string)
}



를 사용하고 있고 변수를 초기화할 때 데이터에 이러한 문제가 발생하는 경우. 이거 먹어봐요.

export default defineComponent({
name: "Student",
 data() {
    return {
       studentList: {} as any,
    }
}
......
})



나는 하는 방법으로 해결했다

const array = new Array()
array.push(123)
console.log(array) // => [123]



저도 같은 오류를 받았습니다

Argument of type 'string' is not assignable to parameter of type 'never'.

재스민 테스트에서:

const toggleModalSpy = spyOn(component, 'toggleUpload').and.callThrough();

실제 오류는 부품에 '토글업로드' 방식이 없다는 것이었다. 그걸 알아내는데 시간이 좀 걸렸어요. 😂


반응형