`gulp-postcss 不是函数` 由 gulp-load-plugins 提供时出现类型错误
`gulp-postcss is not a function` type error when it provided by gulp-load-plugins
我在从 gulp-load-plugins, or incorrectly defined types of gulp-postcss 的类型定义扩展 TypeScirpt 接口 IGulpPlugins
时犯了一些错误。
根据 @types/gulp-load-plugins 的 index.d.ts
中的评论:
/**
* 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 将正常工作。
我看不懂,哪里弄错了。
让我重复一遍,扩展 IGulpPlugins 中除 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;
有 2 件事你没做对。
- 你打错了,或者可能不明白
gulp-load-plugins
是如何工作的。
如果您的插件名称是 gulp-post-css
,那么它将变为 gulpPlugins.postCss
。但是,该插件名称是 gulp-postcss
,因此它将是:
gulpPlugins.postcss(...) // NOT gulpPlugins.postCss !!!
- 你不懂打字稿。
这与打字稿无关。
这是一条经验法则:typescript 对 javascript 运行时行为的影响 为零 。每当您发现运行时错误时,它一定来自 typescript 的 javascript 端。
虽然 1. 已经解决了你的问题,但我们假设你必须使用 gulpPlugins.postCss
。为了让它起作用,请尝试添加这些行:
import * as gulpPostCss from 'gulp-postcss';
gulpPlugins.postCss = gulpPostCss;
现在可以使用了。
我在从 gulp-load-plugins, or incorrectly defined types of gulp-postcss 的类型定义扩展 TypeScirpt 接口 IGulpPlugins
时犯了一些错误。
根据 @types/gulp-load-plugins 的 index.d.ts
中的评论:
/**
* 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 将正常工作。
我看不懂,哪里弄错了。
让我重复一遍,扩展 IGulpPlugins 中除 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;
有 2 件事你没做对。
- 你打错了,或者可能不明白
gulp-load-plugins
是如何工作的。
如果您的插件名称是 gulp-post-css
,那么它将变为 gulpPlugins.postCss
。但是,该插件名称是 gulp-postcss
,因此它将是:
gulpPlugins.postcss(...) // NOT gulpPlugins.postCss !!!
- 你不懂打字稿。
这与打字稿无关。
这是一条经验法则:typescript 对 javascript 运行时行为的影响 为零 。每当您发现运行时错误时,它一定来自 typescript 的 javascript 端。
虽然 1. 已经解决了你的问题,但我们假设你必须使用 gulpPlugins.postCss
。为了让它起作用,请尝试添加这些行:
import * as gulpPostCss from 'gulp-postcss';
gulpPlugins.postCss = gulpPostCss;
现在可以使用了。