【问题标题】:`gulp-postcss is not a function` type error when it provided by gulp-load-plugins当 gulp-load-plugins 提供时,`gulp-postcss is not a function` 类型错误
【发布时间】:2019-08-27 04:13:29
【问题描述】:

当从gulp-load-plugins 的类型定义扩展TypeScirpt 接口IGulpPlugins 或gulp-postcss 的错误定义类型时,我犯了某种错误。

根据index.d.ts 的@types/gulp-load-plugins 中的评论:

/**
 * Extend this interface to use Gulp plugins in your gulpfile.js
 */
interface IGulpPlugins {
}

除了gulp-postcss 之外的所有以下插件都可以使用。

import * as gulpDebug from 'gulp-debug';
import * as gulpPlumber from 'gulp-plumber';
import * as gulpIntercept from 'gulp-intercept';
import * as gulpIf from 'gulp-if';
import * as gulpPug from 'gulp-pug';
import * aas gulpHtmlPrettify from 'gulp-html-prettify';
import * as gulpSass from 'gulp-sass';
import * as gulpStylus from 'gulp-stylus';
import * as gulpSourcemaps from 'gulp-sourcemaps';
import * as gulpPostCss from 'gulp-postcss';

export interface IGulpPlugins {
  plumber: typeof gulpPlumber;
  debug: typeof gulpDebug;
  intercept: typeof gulpIntercept;
  if: typeof gulpIf;
  pug: typeof gulpPug;
  htmlPrettify: typeof gulpHtmlPrettify;
  sass: typeof gulpSass;
  stylus: typeof gulpStylus;
  postCss: typeof gulpPostCss;
  sourcemaps: typeof gulpSourcemaps;
}

以下代码中没有TypseScript编译错误,但是如果执行编译后的TypeScript,则会出现TypeError: gulpPlugins.postCss is not a function错误。

import * as gulp from 'gulp';
import * as GulpPlugins from 'gulp-load-plugins';

// I did not create types for this libary yet, so temporary make TypeScript to ignore it
// @ts-ignore
import * as postcssNormalizeWhitespace from 'postcss-normalize-whitespace';

gulpPlugins: IGulpPlugins = GulpPlugins();

return gulp.src(SOURCE_FILES_GLOB_SELECTION)
    .pipe(gulpPlugins.postCss([postcssNormalizeWhitespace]))
    .pipe(gulp.dest('build'));

如果要写

import * as gulp from 'gulp';
import * as GulpPlugins from 'gulp-load-plugins';

/* When I wrote this question, types in DefinitelyTyped for this library was not exists yet,
 * but I created it. However did not create the pull request yet.
 */
import * as gulpPostCss from 'gulp-postcss';

// I did not create types for this libary yet, so temporary make typescript ingore it
// @ts-ignore
import * as postcssNormalizeWhitespace from 'postcss-normalize-whitespace';


return gulp.src(SOURCE_FILES_GLOB_SELECTION)
    .pipe(gulpPostCss([postcssNormalizeWhitespace]))
    .pipe(gulp.dest('build'));

相反,JavaScript 可以正常工作。

我不明白,我在哪里做错了。 让我重复一遍,扩展 IGulpPl​​ugins 中的所有插件(gulp-postcss 除外)都有效。

我写的gulp-postcss的类型是:

/// <reference types="node"/>
import Vinyl = require('vinyl');

declare function GulpPostCss(plugins?: Array<string>, options?: GulpPostCss.Options): NodeJS.ReadWriteStream;
declare function GulpPostCss(callback?: (file: Vinyl) => { plugins?: Array<string>, options?: GulpPostCss.Options }): NodeJS.ReadWriteStream;

declare namespace GulpPostCss {
    interface Options {
        parser?: string;
    }
}

export = GulpPostCss;

【问题讨论】:

    标签: javascript node.js typescript gulp postcss


    【解决方案1】:

    有两件事你没有做对。

    1. 您打错字了,或者您可能不明白 gulp-load-plugins 的工作原理。

    如果你的插件名称是gulp-post-css,那么它就变成了gulpPlugins.postCss。但是,该插件名称是gulp-postcss,所以它将是:

    gulpPlugins.postcss(...) // NOT gulpPlugins.postCss !!!
    
    1. 你不懂打字稿。

    这与打字稿无关。

    这是一条经验法则:typescript 对 javascript 运行时行为的影响零。每当您发现运行时错误时,它一定来自 typescript 的 javascript 端。

    虽然 1. 已经解决了您的问题,但我们假设您必须使用 gulpPlugins.postCss。为了使它起作用,请尝试添加以下行:

    import * as gulpPostCss from 'gulp-postcss';
    gulpPlugins.postCss = gulpPostCss;
    

    现在它可以工作了。

    【讨论】:

    • 完美答案!感谢您的解释。
    猜你喜欢
    • 2016-06-24
    • 1970-01-01
    • 2017-03-31
    • 2019-12-03
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 2015-01-29
    相关资源
    最近更新 更多