arrays - TypeScript:输入带有值或空的数组/元组

标签 arrays reactjs typescript react-hooks typescript-typings

我正在尝试输入自定义 React hook:

import { useRef } from 'react';

type Reference = [
  Promise<unknown>,
  (value?: unknown) => void,
  (reason?: unknown) => void,
];

const usePromise = () => {
  const reference: Reference = [];
  const container = useRef(reference);

  reference[0] = new Promise((resolve, reject) => {
    reference[1] = resolve;
    reference[2] = reject;
  });

  // [promise, resolve, reject]
  return container.current;
};

export default usePromise;

TypeScript 提示 reference 说:

Type '[]' is not assignable to type 'Reference'.
  Source has 0 element(s) but target requires 3.

如何让 TypeScript 也接受空数组/元组初始化?也许还有一种方法可以给 usePromise 值的类型,这样它就不会说 unknown

最佳答案

编辑2:

如果要将元组初始化为空数组,可以这样做:

const reference : [Reference, Reference, Reference] = ([] as unknown) as [Reference, Reference, Reference];

编辑:根据OP的评论进行编辑

如果你想使用元组,你需要这样做: 请阅读下面的内嵌评论。

type Reference = {
    name:  string;
    age: number;
}

//In your case, it should be something like this beause your tuple may have upto 3 values of type Reference.

//initialization
//null! - the '!' mark after null is the non-null assertion operator, which will let you assign null value to a type Reference.
const reference2: [Reference, Reference, Reference] = [null!, null!, null!];
//assignment
reference2[0] = {name: 'John', age:10};

原始答案: 这是因为您声明了一个 const 变量 reference,其类型为 Reference(称为 Reference 的类、类型或接口(interface)的对象实例)并且但用空数组[]初始化它。

如果您希望 reference 有一个 Reference 对象数组,那么您应该这样做:

const reference: Reference[] = []; 

如果您在 tsconfig 中启用了严格的类型检查,则应该这样做:

const reference: Reference[] = [] as Reference[];

您可以在此处阅读有关 as 关键字的信息:Stack Overflow question about the 'as' keyword

关于arrays - TypeScript:输入带有值或空的数组/元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65204760/

相关文章:

node.js - 找不到包裹命令

javascript - 当我尝试更改输入组件的值时,我收到未定义的 "TypeError: Cannot read property ' 值”

java - JTextPane 将值从数组打印到 Java Swing 应用程序时出现问题

php - 为什么这个 PHP 函数调用只工作一次?

reactjs - 如何取消发布 gatsby 页面而不删除它?

javascript - 无法使用 Three.js 渲染 3D 图形

reactjs - 使用 TypeScript 为 React 高阶组件输入注解

typescript - 无法在本地测试云功能,模拟器无法启动并出现 TypeError : _onRequestWithOpts is not a function

c++ - 如何在 C++ 中使用 Hashmap 查找任意随机数组中总和为特定值的所有对

arrays - 将 JSONB 数组转换为列