typescript linter 在尝试制作 polyfill 时触发错误

Posted

技术标签:

【中文标题】typescript linter 在尝试制作 polyfill 时触发错误【英文标题】:typescript linter triggers error when trying to make a polyfill 【发布时间】:2018-06-17 03:42:22 【问题描述】:

我正在尝试为我的应用程序为不同的浏览器制作一些 polyfill, 我有一个导入其他文件的文件,当我导入它时打字稿失败。

如果我注释掉 - import "../scripts/polyfill_es5" 一切正常,

如果我包含它,脚本会失败并说 -

“对象”类型上不存在属性“assignDeep”

为什么我的导入会破坏代码?

这些是我的文件:

Polyfill.ts:

import "../scripts/polyfill_es5"

interface Object 
    assignDeep: (target: , ...sources: any[]) => object;


Object.prototype.assignDeep = (target: , ...sources: any[]) =>  // .length of function is 2
    'use strict';
    if (target == null)  // TypeError if undefined or null
        throw new TypeError('Cannot convert undefined or null to object');
    

    const to = Object(target);
    let nextSource;

    for (let index = 1; index < sources.length; index++) 
        nextSource = sources[index];

        if (nextSource != null)  // Skip over if undefined or null
            for (const nextKey in nextSource) 
                // Avoid bugs when hasOwnProperty is shadowed
                if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) 
                    if (typeof to[nextKey] === 'object'
                        && to[nextKey]
                        && typeof nextSource[nextKey] === 'object'
                        && nextSource[nextKey]) 
                        to[nextKey] = Object.assignDeep(Array.isArray(to[nextKey]) ? [] : , to[nextKey], nextSource[nextKey]);
                     else 
                        to[nextKey] = nextSource[nextKey];
                    
                
            
        
    
    return to;
;

polyfill_es5.ts:

interface NodeList 
    forEach : (callback : (currentValue : Node, currentIndex : number, listObj : NodeList) => void, thisArg : string|Window) => void;


if (typeof NodeList !== 'undefined' && !NodeList.prototype.forEach) 
    NodeList.prototype.forEach = (callback : (currentValue : Node, currentIndex : number, listObj : NodeList) => void, thisArg : string|Window) => 
        thisArg = thisArg || window;
        for (let i = 0; i < this.length; i++) 
            callback.call(thisArg, this[i], i, this);
        
    ;

【问题讨论】:

【参考方案1】:

你需要做全局增强:

declare global 
  interface Object 
    assignDeep: (target: , ...sources: any[]) => object;
  

当文件包含***导入/导出语句时,TypeScript 编译器会将文件视为模块文件。所以你的interface Object 是文件本地的,而不是全局的Object

【讨论】:

非常感谢它的帮助

以上是关于typescript linter 在尝试制作 polyfill 时触发错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 TypeScript 和 Maquette JSX 但 linter 说 'jsx' 未使用

对象可能是“null”——TypeScript linter 出错

TypeScript 无法识别 React 正在我的 VSCode 中的 linter 中导入和使用

为 TypeScript 文件禁用 ESLint

如何为非官方的vue模块或任何软件包制作声明文件?

Angular 5 Typescript - 保存本地 JSON 文件