这与#40796374类似,但这与类型有关,而我使用的是接口。
鉴于以下代码:
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);
}
}
我有一个错误,说'属性'名称'不存在于类型'never'。
我不明白实例怎么可能是'从不'。任何人都可以对此有所了解吗?
提前致谢。
答案 0 :(得分:27)
因为您要将instance
分配给null
。编译器推断它永远不会是null
以外的任何东西。因此,它假定永远不应该执行else块,因此在{8}中将instance
键入为never
。
现在,如果您不将其声明为文字值null
,并通过任何其他方式获取(例如let instance: Foo | null = getFoo();
),您会看到instance
将{ {1}}位于if块内,null
位于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
答案 1 :(得分:27)
如果您将Component编写为React.FC,并使用useState(),
只写这样会很有帮助:
const [arr, setArr] = useState<any[]>([])
答案 2 :(得分:11)
我遇到了相同的错误,并用括号表示法替换了点表示法以消除该错误。
例如: obj.name-> obj ['name']
答案 3 :(得分:7)
这似乎与此问题类似:False "Property does not exist on type 'never'" when changing value inside callback with strictNullChecks,此问题已被关闭(讨论):Trade-offs in Control Flow Analysis。
这个讨论很长,如果你找不到合适的解决方案,你可以这样做:
if (instance == null) {
console.log('Instance is null or undefined');
} else {
console.log(instance!.name); // ok now
}
答案 4 :(得分:1)
如果收到参数错误,请保持any
或any[]
类型的输入,如下所示
getOptionLabel={(option: any) => option!.name}
<Autocomplete
options={tests}
getOptionLabel={(option: any) => option!.name}
....
/>
答案 5 :(得分:1)
在我自己的情况下,当我启动数组时。我用过:
selectedActors: any = [];
所以它首先使它变得“动态”
答案 6 :(得分:0)
就我而言,这是因为我没有输入变量。
所以我创建了搜索界面
export interface Search {
term: string;
...
}
我改了
searchList = [];
为此,它奏效了
searchList: Search[];
答案 7 :(得分:0)
就我而言(我正在使用打字稿),我试图用假数据模拟响应,稍后分配数据。我的第一次尝试是:
let response = {status: 200, data: []};
之后,在分配假数据时,它开始抱怨它不能分配给类型 'never[]'。 然后我定义如下响应并接受它..
let dataArr: MyClass[] = [];
let response = {status: 200, data: dataArr};
和伪造数据的分配:
response.data = fakeData;
答案 8 :(得分:0)
我遇到了问题?和!
这件作品对我有用。
if (ref != null){
if (ref.current != null)
ref.current.appendChild(child);
}