'属性'不存在'永远'

时间:2017-05-24 02:26:21

标签: typescript

这与#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'。

我不明白实例怎么可能是'从不'。任何人都可以对此有所了解吗?

提前致谢。

9 个答案:

答案 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)

如果收到参数错误,请保持anyany[]类型的输入,如下所示

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);
}