在 Typescript 中键入递归的不可变 js 记录

Posted

技术标签:

【中文标题】在 Typescript 中键入递归的不可变 js 记录【英文标题】:Typing a recursive Immutable js Record in Typescript 【发布时间】:2021-09-03 14:32:42 【问题描述】:

我正在尝试使用不可变的 js 和打字稿来表示树状数据结构。现在,我正在使用普通的 vanilla js 对象来表示树中的节点。这是类型签名。

type NodeType = 
    value: string
    children: List<NodeType>

我想将其转换为记录,但我对如何执行此操作感到困惑。如果我只是为了显而易见:

const defaultValues: NodeType = 
    value: "foo",
    children: List()

const NodeRecord = Record(defaultValues)

...那么在顶层就可以了,但它会期望孩子的类型是NodeType而不是RecordOf(NodeType)

有人知道怎么做吗? 谢谢

【问题讨论】:

您是否遇到了特殊问题?因为据我所知,您的代码可以按您的预期工作:tsplay.dev/N5EpPN 【参考方案1】:

an example in the docs 可能会有所帮助。 按照您的编写方式,您的 NodeType 仅描述 默认值,而不是 Record

import type  RecordFactory, RecordOf  from 'immutable';

// Use RecordFactory<TProps> for defining new Record factory functions.
type NodeTypeProps =  
  value: string
  children: List<RecordOf<NodeTypeProps>>
;
const defaultValues: NodeTypeProps =  value: "meh" ;
const makeNodeType: RecordFactory<NodeTypeProps> = Record(defaultValues);

type NodeType = RecordOf<NodeTypeProps>;
const someNodeType: NodeType = makeNodeType( value: "some" );

免责声明:我从未将 Immutable 与 TS 一起使用,并且知道它有时会有点痛苦。由于类型是递归的,因此可能需要额外的步骤来让 TS 编译器满意

【讨论】:

以上是关于在 Typescript 中键入递归的不可变 js 记录的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Node.js 包中的 TypeScript 键入信息?

在 Typescript 中遍历可变参数元组

递归排除 Typescript 中的只读属性

在 TypeScript 中键入匿名对象的属性

在反应 TypeScript 中键入输入的键值 [重复]

是否可以在 TypeScript 中精确键入 _.invert?