Это похоже на # 40796374, но это касается типов, а я использую интерфейсы.

Учитывая приведенный ниже код:

интерфейс Foo {
  имя: строка;
}

function go () {
  let instance: Foo | ноль = ноль;
  let mutator = () => {
   instance = {
     имя: 'строка'
   };
  };

  мутатор ();

  if (instance == null) {
   console.log ('Экземпляр равен нулю или не определен');
  } еще {
   console.log (имя_экземпляра);
  }
}

У меня появляется сообщение об ошибке «Имя свойства» не существует для типа «никогда».

Я не понимаю, как экземпляр может быть «никогда». Может ли кто-нибудь пролить свет на это?

Ray Booysen

Ответов: 10

Ответы (10)

Потому что вы назначаете instance null. Компилятор делает вывод, что это никогда не может быть ничем иным, кроме null. Таким образом, предполагается, что блок else никогда не должен выполняться, поэтому instance набирается как never в блоке else.

Теперь, если вы не объявляете его как буквальное значение nullи получаете его любым другим способом (например, let instance: Foo | null = getFoo ();), вы увидите, что instance будет null внутри блока if и Foo внутри блока else.

Никогда не вводите документацию: https://www.typescriptlang.org/docs/handbook/basic-types.html#never

Изменить:

Проблема в обновленном примере на самом деле является открытой проблемой с компилятором. См .:

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

, если вы пишете Component как React.FC и используете useState (),

просто напишите вот так:

const [arr, setArr] = useState([])

В моем случае это произошло потому, что я не ввел переменную.

So I created the Search interface

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

Я изменил это

searchList = [];

для этого и заработало

searchList: Search[];

В моем собственном случае, когда я инициировал массив. Я использовал:

selectedActors: any = [];

Так что сначала делает "динамическим"

, если вы получаете ошибку в параметре, поэтому оставьте любой или любой [] тип ввода, как показано ниже

getOptionLabel={(option: any) => option!.name}
  option!.name}
    ....
  />

У меня работает следующий код:

const [disc, setDisc] = useState([]);

До сих пор я видел следующее: когда вы не указываете тип, который вы передаете в useState (), он считает, что это тип never. Заставив его использовать any [], вы сможете передавать данные по запросу.

Это похоже на эту проблему: False «Свойство не существует для типа 'never'» при изменении значения внутри обратного вызова с помощью strictNullChecks, который закрывается как дубликат этой проблемы (обсуждение): Компромиссы в анализе потока управления.

Это обсуждение довольно долгое, если вы не можете найти там хорошее решение, вы можете попробовать следующее:

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

У меня были проблемы с? и!

Эта штука у меня сработала.

if (ref! = Null) {
    если (исх. текущий! = ноль)
        ref.current.appendChild (дочерний элемент);
}

У меня была та же ошибка, и я заменил точечную нотацию на скобку, чтобы ее подавить.

например:

obj.name -> obj['name']

В моем случае (я использую машинописный текст) я пытался смоделировать ответ с помощью поддельных данных, которые назначаются позже. Моя первая попытка была с:

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

и позже, при присвоении фальшивых данных он начинает жаловаться, что его нельзя присвоить типу 'never []'. Затем я определил ответ, как показано ниже, и он его принял ..

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

и присвоение фейковых данных:

response.data = fakeData;

2022 WebDevInsider