如何在TypeScript类型定义中注释预先库中的未知数?

时间:2019-04-12 02:40:23

标签: typescript types typescript-typings

在下面parser?: Object;gulp-postcss的类型定义中,可以播放任何npm库。我应该如何注释它?

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

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

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

export = GulpPostCss;

在没有其他解决方案的情况下(当然,DefinitelyTyped不接受any类型),当然ObjectObject是最后的解决方案。

1 个答案:

答案 0 :(得分:1)

在Typescript 3.0中,有一个名为the unknown type的新语言项。它在某种程度上类似于any,意味着它可以容纳所有可能的值(所有内容都可以分配给unknown),但有一个很大的区别:使用any您可以立即进行任何操作,但是使用unknown时,您不能做任何事情或将其分配给任何事情,而无需先检查您真正获得的价值(或确定使用type assertion)您所拥有的)。当存在任意映射时,这是最合适的选择。

如果必须支持3.0之前的版本,则可以通过进行并集来模拟unknown类型,就像完成here一样:

export type mixed = { [key: string]: any } | object | number | string | boolean | symbol | undefined | null | void;

declare global {
  type unknown = mixed;
}

这有一个缺点,但是,您不能轻易包括索引类型-请注意,{ [key: string]: any }中的值是any,而不是unknown,因为后者会使定义直接递归。


关于Object类型的附带说明:我不知道无法用object来安全替换它的任何用例,除非明确键入构造函数。这似乎是DefinitelyTyped不接受它的原因。一个警告是object类型在某种程度上更具局限性,因为您不能在其中存储string(但是可以存储String对象)。