'Property does not exist on type 'never'

Typescript

Typescript Problem Overview


This is similar to #40796374 but that is around types, while I am using interfaces.

Given the code below:

interface Foo { name: string; }

function go() { let instance: Foo | null = null; let mutator = () => { instance = { name: 'string' };
};

mutator();

if (instance == null) { console.log('Instance is null or undefined'); } else { console.log(instance.name); } }

I have an error saying 'Property 'name' does not exist on type 'never'.

I don't understand how instance could ever be a 'never'. Can anyone shed some light on this?

Typescript Solutions


Solution 1 - Typescript

if you write Component as React.FC, and using useState(),

just write like this would be helpful:

const [arr, setArr] = useState<any[]>([])

Solution 2 - Typescript

Because you are assigning instance to null. The compiler infers that it can never be anything other than null. So it assumes that the else block should never be executed so instance is typed as never in the else block.

Now if you don't declare it as the literal value null, and get it by any other means (ex: let instance: Foo | null = getFoo();), you will see that instance will be null inside the if block and Foo inside the else block.

Never type documentation: https://www.typescriptlang.org/docs/handbook/basic-types.html#never

Edit:

The issue in the updated example is actually an open issue with the compiler. See:

https://github.com/Microsoft/TypeScript/issues/11498 https://github.com/Microsoft/TypeScript/issues/12176

Solution 3 - Typescript

I had the same error and replaced the dot notation with bracket notation to suppress it.

e.g.:

obj.name -> obj['name']

Solution 4 - Typescript

This seems to be similar to this issue: False "Property does not exist on type 'never'" when changing value inside callback with strictNullChecks, which is closed as a duplicate of this issue (discussion): Trade-offs in Control Flow Analysis.

That discussion is pretty long, if you can't find a good solution there you can try this:

if (instance == null) {
    console.log('Instance is null or undefined');
} else {
    console.log(instance!.name); // ok now
}

Solution 5 - Typescript

if you're receiving the error in parameter, so keep any or any[] type of input like below

getOptionLabel={(option: any) => option!.name}
 <Autocomplete
    options={tests}
    getOptionLabel={(option: any) => option!.name}
    ....
  />

Solution 6 - Typescript

In my own case when I was initiating the array. I used:

selectedActors: any = [];

So it makes it "dynamic" at first

Solution 7 - Typescript

For me the following code is working:

const [disc, setDisc] = useState<any[]>([]);

What I've seen this far is the following: When you don't specify the type you are passing to the useState() it inferes it is type never. By make it use the any[] you are able to pass the data when it is requested.

Solution 8 - Typescript

In my case (I'm using typescript) I was trying to simulate response with fake data where the data is assigned later on. My first attempt was with:

let response = {status: 200, data: []};

and later, on the assignment of the fake data it starts complaining that it is not assignable to type 'never[]'. Then I defined the response like follows and it accepted it..

let dataArr: MyClass[] = [];
let response = {status: 200, data: dataArr};

and assigning of the fake data:

response.data = fakeData;

Solution 9 - Typescript

In my case it was happening because I had not typed a variable.

So I created the Search interface

export interface Search {
  term: string;
  ...
}

I changed that

searchList = [];

for that and it worked

searchList: Search[];

Solution 10 - Typescript

I was having problems with ? and !

This piece worked for me.

if (ref != null){
    if (ref.current != null)
		ref.current.appendChild(child);
}

Solution 11 - Typescript

I've came across the issue with the following expression:

const node = item ? <a href={item.link}>{item.name}</a> : item.name

And the else part item.name said Property 'name' does not exist on type 'never'.

Well this is because if there is nothing inside the item object - there can't be a name property as well.

So this warning happens when you declare something basically impossible (that's why it's never)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionRay BooysenView Question on Stackoverflow
Solution 1 - Typescriptblue-hopeView Answer on Stackoverflow
Solution 2 - TypescriptSaravanaView Answer on Stackoverflow
Solution 3 - TypescriptEric GrotkeView Answer on Stackoverflow
Solution 4 - TypescriptNitzan TomerView Answer on Stackoverflow
Solution 5 - TypescriptEricgitView Answer on Stackoverflow
Solution 6 - TypescriptKazeem QuadriView Answer on Stackoverflow
Solution 7 - TypescriptLucas GabrielView Answer on Stackoverflow
Solution 8 - TypescriptKiril DobrevView Answer on Stackoverflow
Solution 9 - TypescriptJulio Cesar Brito GomesView Answer on Stackoverflow
Solution 10 - TypescriptAshu SahuView Answer on Stackoverflow
Solution 11 - TypescriptKia KahaView Answer on Stackoverflow