这类似于#40796374,但这是围绕类型,而我使用接口。

给定下面的代码:

接口Foo { 名称:字符串; } 函数go() { 让实例:Foo | null = null; Let mutator = () => { 实例= { 名称:“字符串” }; }; mutator (); If (instance == null) { console.log('实例为空或未定义'); }其他{ console.log (instance.name); } }

我有一个错误说'属性'名称'不存在类型'从不'。

我不明白实例怎么会是一个“永远”。有人能解释一下吗?


因为你把instance赋值为null。编译器推断它只能是null。所以它假设else块永远不会被执行,所以instance的类型永远不会在else块中。

现在,如果你不将它声明为字面值null,而是通过任何其他方式获取它(例如:let instance: Foo | null = getFoo();),你会看到实例在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


这似乎类似于这个问题:当使用strictNullChecks在回调中更改值时,False“属性不存在于类型'never'”,这是这个问题(讨论)的副本:控制流分析中的权衡。

这个讨论很长,如果你找不到好的解决方案,你可以试试这个:

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

我有同样的错误,把点符号换成了括号符号来抑制它。

例如:

obj.name -> obj['name']

如果你把Component写成React。FC,使用useState(),

这样写会很有帮助:

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

如果你在参数中收到错误,那么保持任何或任何[]类型的输入,如下所示

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

在我的例子中,发生这种情况是因为我没有输入变量。

所以我创建了搜索界面

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

我改变了

searchList = [];

为此,它起作用了

searchList: Search[];

在我的情况下(我使用typescript),我试图模拟假数据的响应,其中数据被分配后。我的第一个尝试是:

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

后来,在分配假数据时,它开始抱怨它不能分配给类型'never[]'。 然后我像这样定义响应,它接受了它。

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

以及假数据的分配:

response.data = fakeData;

在我自己的例子中,当我初始化数组时。我使用:

selectedActors: any = [];

所以一开始它是“动态的”


我有什么问题吗?和!

这件作品对我很有用。

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

对我来说,以下代码是工作的:

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

到目前为止,我所看到的是:当你没有指定传递给useState()的类型时,它推断它永远是类型。 通过使用any[],您可以在请求时传递数据。


我用下面的表达方式遇到了这个问题:

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

else部分item。name表示属性" name "在类型" never "上不存在。

这是因为如果item对象中什么都没有,那么name属性也不可能存在。

所以当你声明一些基本不可能的事情时,这个警告就会发生(这就是为什么它从来没有)


在useState中,如果你从未声明过类型:

它假设它的类型是never,所以它显示这个错误:"属性不存在类型'never'"

你可以这样输入:

const [datalist, setDataList] = useState<Array<Object>>([]);

在你的组件中。Ts文件只是像下面那样声明数组

public arrayName = ([] as any[]);

它和我一起为Angular工作过


当我忘记为变量定义类型时,就发生了这种情况。


对于typescript开发者… 如果你使用React.useRef()钩子 声明并使用变量类型any,而不是预先分配null。

例子:

const initialRef: any = null;
const ref = React.useRef(initialRef);

有时,初始值可能为空。 在这种情况下,你可能会说例子

让val = data。notificationId——>这里它会抛出一个错误。 所以我们可以简单地写出来 let val = data && data. notificationid


如果您以这种方式使用UseState,应该不会有问题

const [data, setData] = useState<any>([]);

在Javascript的情况下,它直接工作,因为所有的数据类型都是Any 默认情况下,Typescript中不是这样的,所以你必须让语言知道:)


如果你使用React useRef钩子和TypeScript,而不是使用任何你可以做下面的事情。

const ref = useRef<HTMLInputElement>(null);

你可以这样输入:

const[数据,setData] = useState<Array>([];