最近刚学TypeScript,贴一个TypeScript和一个JavaScript,请大佬们多多指正

function dom2json() {
    let test = document.getElementById("jsContainer");
    return dfs(test!);
}
type TextType = {
    tag: "text",
    content: string
};
type MyType = {
    tag: string,
    attributes:Record<string, string>,
    children: (MyType|TextType)[]
}
function dfs(node: HTMLElement) {
    if(node.nodeType === Node.ELEMENT_NODE) {
        let attributes: Record<string, string> = {};
        for(let i = 0; i < node.attributes.length; ++i) {
            attributes[`${node.attributes[i].nodeName}`] = `${node.attributes[i].nodeValue}`
        }
        let child = Array.from(node.childNodes).filter((v)=> {
            return v.nodeType === Node.ELEMENT_NODE || (v.nodeType === Node.TEXT_NODE && v.nodeValue!.trim() !== '');
        })

        let ret:MyType = {
            "tag": node.nodeName.toLowerCase(),
            attributes,
            "children": child.map((v) => {
                return dfs(v as HTMLElement);
            })
        };
        return ret;
    }
    else {
        let ret:TextType = {
            "tag": "text",
            "content": node.nodeValue!.trim()
        }
        return ret;
    }
}
function dom2json() {
    var test = document.getElementById("jsContainer");
    return dfs(test);
}
function dfs(node) {
    if (node.nodeType === Node.ELEMENT_NODE) {
        var attributes = {};
        for (var i = 0; i < node.attributes.length; ++i) {
            attributes["".concat(node.attributes[i].nodeName)] = "".concat(node.attributes[i].nodeValue);
        }
        var child = Array.from(node.childNodes).filter(function (v) {
            return v.nodeType === Node.ELEMENT_NODE || (v.nodeType === Node.TEXT_NODE && v.nodeValue.trim() !== '');
        });
        var ret = {
            "tag": node.nodeName.toLowerCase(),
            attributes: attributes,
            "children": child.map(function (v) {
                return dfs(v);
            })
        };
        return ret;
    }
    else {
        var ret = {
            "tag": "text",
            "content": node.nodeValue.trim()
        };
        return ret;
    }
}