React 中的“从不”类型不存在属性
Property does not exist on type ‘never’ in React
当我们忘记键入一个状态数组或没有键入useRef
钩子的返回值时,就会出现“Property does not exist on type ‘never’”的错误。要解决该错误,请使用泛型在 React 应用程序中显式键入状态数组或 ref 值。
如果在使用useState挂钩声明数组状态变量时出现错误
,请使用泛型来键入数组。
import {useState} from 'react'; function App() { // 👇️ use generic to type the state array const [arr, setArr] = useState<any[]>([]); return ( <div className="App"> <div>Hello world</div> </div> ); } export default App;
该示例使用非常广泛的any
类型,但该概念适用于更具体的类型。
下面是一些示例,说明在键入数组状态变量时如何使用更具体的类型。
import {useState} from 'react'; function App() { // 👇️ type it as string[] const [strArr, setStrArr] = useState<string[]>([]); // 👇️ type it as object array const [objArr, setObjArr] = useState<{name: string; age: number}[]>([]); return ( <div className="App"> <div>Hello world</div> </div> ); } export default App;
这解决了错误的原因是因为如果您不显式键入数组,它会隐式获取类型never[]
,这实际上是一个始终为空的数组。
在将 refs 与useRef挂钩结合使用时,您还可能会收到“类型‘never’上不存在属性”错误
。
import {useEffect, useRef} from 'react'; const ComponentA = () => { const inputRef = useRef(null); useEffect(() => { // ⛔️ Error: Property 'focus' does not exist on type 'never'.ts(2339) inputRef.current?.focus(); }, []); return ( <div> <input ref={inputRef} /> </div> ); };
要解决该错误,请使用泛型显式键入ref
.
import {useEffect, useRef} from 'react'; const ComponentA = () => { // 👇️ type the ref as HTML input element const inputRef = useRef<HTMLInputElement>(null); useEffect(() => { // ✅ Works now inputRef.current?.focus(); }, []); return ( <div> <input ref={inputRef} /> </div> ); };
我们使用泛型将 ref 类型化为 an,HTMLInputElement
因为我们将分配给ref
示例中的input
元素。
您的类型可能会有所不同。如果是不同的 HTML 元素,它们的名称是一致的,例如HTMLDivElement
,HTMLSpanElement
等。
的类型ref
可以是对象或适合您的用例的任何类型。
import {useRef} from 'react'; const ComponentA = () => { const inputRef = useRef<{name: string}>(null); console.log(inputRef.current?.name.toUpperCase()); return ( <div> Hello World </div> ); };
这是必要的,因为如果我们不输入ref
,TypeScript 就无法知道我们最终会分配给它什么类型的值。
ref
,还是像前面的例子那样把它赋给 HTML 元素。如果您收到“属性在‘never’类型上不存在”错误,很可能是您忘记了显式键入一个值,而它隐式地分配了一个never
类型。
要对此进行调试,请将鼠标悬停在该值上并寻找输入它的方法——如果使用 React 钩子,最有可能使用泛型。
结论
当我们忘记键入一个状态数组或没有键入useRef
钩子的返回值时,就会出现“Property does not exist on type ‘never’”的错误。要解决该错误,请使用泛型在 React 应用程序中显式键入状态数组或 ref 值。