reactjs 有没有一种方法可以确保类型的成员实际存在于TypeScript中的对象中?

jgwigjjp  于 5个月前  发布在  React
关注(0)|答案(1)|浏览(77)

我有一个存储数据的对象。我有一个UserPrompt类型,节点和边缘对象(来自Reactflow库)。
我希望UserPrompt类型的node_id只接受已经存在于我的'nodes'对象中的id。这在TypeScript中可以做到吗?
例如:如果nodes对象中只有一个id为5的节点,UserPrompt将不接受id为3的节点。
代码:

'use client';

import { Edge, Node, NodeProps, useEdges, useNodes } from 'reactflow';
import { Button } from './ui/button';

type UserPrompt = {
  id: number;
  text: string;
  node_id: NodeProps['id'];
};

type SessionObject = {
  nodes: Node<unknown>[];
  edges?: Edge<unknown>[];
  prompts?: UserPrompt[];
};

export default function SaveSessionButton() {
  //TODO: save nodes, edges, user's prompts!
  //TODO: don't save single chat node.
  const nodes = useNodes();
  const edges = useEdges();

  function handleOnClick() {
    const obj: SessionObject = {} as SessionObject;
    obj['nodes'] = nodes;
    obj['edges'] = edges;
    console.log(obj);
  }

  return <Button onClick={handleOnClick}>Save session</Button>;
}

字符串

uoifb46i

uoifb46i1#

首先,默认情况下,Typescript不能在运行时进行类型检查。这(或某种程度上)可以通过一些第三方库来实现,但这实际上不是您所需要的。
这里你需要的是一个函数,它将验证输入,并允许在输入不正确的情况下继续或抛出错误。有多种选择如何实现它。让我们来看看一个简单的例子,如果node_id是正确的,它会产生正确的对象:

const makePrompt = (obj: SessionObject, id: number, text: string, node_id: NodeProps['id']): UserPrompt => {
    const nodes = obj['nodes'];
    const isValid = nodes.some(n => n.id === node_id);
    if (!isValid) { 
        throw new Error('Node does not exist!')
    }
    return { id, text, node_id }
}

// then somewhere in the code:
const prompt = makePrompt(session, 123, 'hello', 5);

字符串
另外,你不需要把整个session对象传递到那里,而可以只使用节点列表,我在例子中使用它是为了更清楚。
基本上,你也可以在现有的代码中添加isValid检查,避免创建单独的函数。然而,有一个专用的方法来验证和对象生成是更方便和方便的,特别是如果有多个放置在你需要UserPrompt对象的地方。

相关问题