'属性'不存在'永不'

Ray*_*sen 35 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);
  }
}
Run Code Online (Sandbox Code Playgroud)

我有一个错误,说'属性'名称'在类型上'不存在'永远'.

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

提前致谢.

blu*_*ope 71

如果你把组件写成 React.FC,并使用 useState(),

像这样写会有所帮助:

const [arr, setArr] = useState<any[]>([])
Run Code Online (Sandbox Code Playgroud)

  • 这解决了我的问题,我无法将类型分配给“arr”作为“arr:any”。 (4认同)
  • 请问这能解决问题背后有什么理由吗?这只是添加了额外的不必要的 Typescript 还是实际上使他的代码更加类型安全? (2认同)
  • @blue-hope 也很想听听解释。 (2认同)

Niv*_*han 59

如果您使用 React useRefhook 与TypeScript, 而不是使用,any您可以执行以下操作。

const ref = useRef<HTMLInputElement>(null);
Run Code Online (Sandbox Code Playgroud)

  • 你救了我的命。对于其他人:如果您的元素未输入,请相应地更改 &lt;&gt; 内的内容,例如。&lt;HTMLDivElement&gt;。 (7认同)

Sar*_*ana 39

因为你要分配instancenull.编译器推断它永远不会是除了之外的任何东西null.因此,它假定应该永远不执行else块,因此在else块中instance键入never.

现在,如果你没有将它声明为文字值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


Eri*_*tke 30

我有同样的错误,并用括号表示法替换了点表示法以抑制它。

例如:

obj.name -> obj['name']
Run Code Online (Sandbox Code Playgroud)

  • 这是一个错误吗?也为我工作。为什么点表示法不起作用? (36认同)
  • @wrod7,是的,这是一个错误:https://github.com/microsoft/TypeScript/issues/50769 (4认同)

小智 12

就我自己而言,当我启动阵列时。我用了:

selectedActors: any = [];
Run Code Online (Sandbox Code Playgroud)

所以它一开始就让它变得“动态”


Nit*_*mer 11

这看起来与此问题类似:假"在使用strictNullChecks更改回调内的值时,属性'不存在于类型'never'",该关闭作为此问题的副本(讨论):控制流分析中的权衡.

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

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


Luc*_*iel 11

对我来说,以下代码有效:

const [disc, setDisc] = useState<any[]>([]);
Run Code Online (Sandbox Code Playgroud)

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


小智 8

对于打字稿开发人员...如果您使用 React.useRef() 钩子,而不是预先分配 null,声明并使用变量类型 any。

例子:

const initialRef: any = null;
const ref = React.useRef(initialRef);
Run Code Online (Sandbox Code Playgroud)

  • 或者 `const ref = useRef&lt;any&gt;(null);` (2认同)

Blo*_*gic 7

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

getOptionLabel={(option: any) => option!.name}
Run Code Online (Sandbox Code Playgroud)
 <Autocomplete
    options={tests}
    getOptionLabel={(option: any) => option!.name}
    ....
  />
Run Code Online (Sandbox Code Playgroud)


小智 5

在您的 component.ts 文件中,只需将数组声明如下

public arrayName = ([] as any[]);
Run Code Online (Sandbox Code Playgroud)

这对我来说对 Angular 有用