могу ли я «привязать» существующее свойство объекта к другому типу в typescript?

#typescript

Вопрос:

TLamp;DR версия: пусть a = { «prop1″:1,»prop2″:»2»} как я могу сделать.prop=2 специально?

Более подробная информация: Привет, ребята, я использую структуру данных в typescript и пытаюсь закодировать функцию преобразования дерева, которая принимает дерево в одной форме и преобразует его в другую форму:

 //a simple binary tree node
type Node = {
    key: number,
    left: Node | null,
    right: Node | null,
    p: Node | null
}

//a tree node
type TreeNode<ND> = {
    node: ND
    children: Array<TreeNode<ND>>
} | null
 

Я хочу преобразовать дерево «Узел» в дерево «Дерево дерева», чтобы сделать его более общим, я хочу сделать его функцией высокого порядка, которая использует функцию nodeMapper для выполнения работы по изменению формы для каждого узла дерева

 
function generalizeTree(root: Node, nodeMapper: (n: Node) => Pick<TreeNode<number>, "node"> amp; { children: Node[] }): TreeNode<number> {
    if (root == null) {
        return null
    } else {
        let gNode = nodeMapper(root)
        return {
            node: gNode.node,
            children: gNode.children.reduce((accu, c) => {
                let r = generalizeTree(c, nodeMapper)
                if (r) {
                    accu.push(r)
                }
                return accu
            }, [])
        }
        // gNode.children as TreeNode<number> =
        // return gNode
    }
}
 

но меня не устраивает этот код, в котором я должен построить новый объект типа Node и вернуть его:

         let gNode = nodeMapper(root)
        return {
            node: gNode.node,
            children: gNode.children.reduce((accu, c) => {
                let r = generalizeTree(c, nodeMapper)
                if (r) {
                    accu.push(r)
                }
                return accu
            }, [])
        }
 

потому что переменная gNode включила все правильно, за исключением типа свойства «дети»: Выберите<TreeNode, «узел»> amp; { дети: Узел[] }. После let gNode = nodeMapper(root) этого переменная gNode.children должна быть изменена с «Pick<TreeNode, «node»> amp; { children: Node[] }» на «TreeNode» рекурсивным вызовом моего конвертера.

В JS я могу просто уменьшить свойство children само по себе с помощью одного оператора присваивания, в котором сокращение изменит данные с «Pick<TreeNode, «node»> amp; { children: Node[] }» на «TreeNode».

       let gNode = nodeMapper(root)
          gNode.children= gNode.children.reduce(...)
      return gNode
 

But in TS, let gNode forces gNode to Pick<TreeNode, «node»> amp; { children: Node[] }. when I do gNode.children= gNode.children.reduce(…), the compiler complaints:
Type ‘Pick<{ node: number; children: …[]; }, «node»> amp; { children: Node[]; }’ is not assignable to type ‘{ node: number; children: …[]; }’.
Types of property ‘children’ are incompatible.
Type ‘Node[]’ is not assignable to type ‘{ node: number; children: …[]; }[]’.
Type ‘Node’ is missing the following properties from type ‘{ node: number; children: …[]; }’: node, children

How can I overcome this?
define gNode’s type as Union like this let gNode: Pick<TreeNode<number>, "node"> amp; { children: Node[] }|Node[] is not acceptable here, it’s just like «any».