#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».