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,
해결책: '없음'으로 입력
당신은 또한 추가할 수 있다
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에서는 변수의 유형을 정의해야 합니다:
문자열일 경우 다음과 같이 해야 합니다:
공용 메시지: 문자열 ="";
숫자인 경우:
public n : number=0;
문자열 테이블인 경우:
공용 탭: 문자열[] = [];
만약 숫자표:
공용 탭: 번호[]=[];
혼합 테이블인 경우:
공용 탭: any[] = [];......... 등(다른 유형의 변수인 경우)
변수 유형을 정의하지 않으면 기본적으로 유형은 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();
실제 오류는 부품에 '토글업로드' 방식이 없다는 것이었다. 그걸 알아내는데 시간이 좀 걸렸어요. 😂
'개발하자' 카테고리의 다른 글
하나의 YAML 파일에서 여러 종류의 Kubernetes API에 대해 client-go to 'kubectl apply'를 직접 사용하는 것 (1) | 2023.09.22 |
---|---|
스크립트 열거값을 배열로 입력합니다 (0) | 2023.09.22 |
주피터 노트북의 테마를 변경하시겠습니까? (0) | 2023.09.21 |
주피터 노트북의 플롯 옆에 데이터 프레임을 표시하는 방법 (0) | 2023.09.20 |
json을 호환 가능한 다트 형식으로 변환하고 싶습니다. 도와주세요. 저는 플러터 초보입니다 (0) | 2023.09.20 |