What is “not assignable to parameter of type never” error in typescript?

前端 未结 10 2155
無奈伤痛
無奈伤痛 2020-12-04 15:08

Code is:

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

I get the following TS error:

[t

相关标签:
10条回答
  • 2020-12-04 15:37

    One more reason for the error.

    if you are exporting after wrapping component with connect()() then props may give typescript error
    Solution: I didn't explore much as I had the option of replacing connect function with useSelector hook
    for example

    /* 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} />
    }
    
    0 讨论(0)
  • 2020-12-04 15:38

    This seems to be a recent regression or some strange behavior in typescript. If you have the code:

    const result = []
    

    Usually it would be treated as if you wrote:

    const result:any[] = []
    

    however, if you have both noImplicitAny FALSE, AND strictNullChecks TRUE in your tsconfig, it is treated as:

    const result:never[] = []
    

    This behavior defies all logic, IMHO. Turning on null checks changes the entry types of an array?? And then turning on noImplicitAny actually restores the use of any without any warnings??

    When you truly have an array of any, you shouldn't need to indicate it with extra code.

    0 讨论(0)
  • 2020-12-04 15:43

    I was having same error In ReactJS statless function while using ReactJs Hook useState. I wanted to set state of an object array , so if I use the following way

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

    and update the state like this:

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

    I was getting error:

    Argument of type '{ id: number; text: any }' is not assignable to parameter of type 'never'

    but if do it like this,

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

    Error is gone but there is an item at 0 index which don't have any data(don't want that).

    so the solution I found is:

    const [items , setItems] = useState([] as any);
    
    0 讨论(0)
  • 2020-12-04 15:45

    Another way is :

    const result = [] as  any;
    
    0 讨论(0)
提交回复
热议问题