typescript 2.2 接口扩展对象类型

Fla*_*rna 9 typescript typescript2.2

我有使用对象作为参数的函数,如下所示:

interface Options {
    foo?: string;
    bar?: number;
};

function fooNction(opts: Options): void {
}
Run Code Online (Sandbox Code Playgroud)

这在某些情况下工作正常,但不是全部:

fooNction({foo: "s"});   // OK
fooNction({a: "x"});     // fine as TS gives an Error as expected
fooNction("hello");      // no Error...
Run Code Online (Sandbox Code Playgroud)

我试图像这样从 TS 2.2 对象类型扩展我的接口

interface Options extends object {
    foo?: string;
    bar?: number;
};
Run Code Online (Sandbox Code Playgroud)

禁止基本类型,但打字稿告诉“不能很好地命名‘对象’”。

有什么方法可以定义接口必须是对象但没有必填字段?

art*_*tem 7

出于某种原因,不允许有扩展内置类型的接口,如objectstring。您可以通过声明类型别名试图绕过object这样

type ObjectAlias = object;

interface Options extends ObjectAlias {
   ...
}
Run Code Online (Sandbox Code Playgroud)

但它仍然不起作用,因为结构兼容性用于类型检查接口:

function fooNction(opts: Options): void {
}

fooNction("hello"); //ok
Run Code Online (Sandbox Code Playgroud)

所以它似乎object只能用于交集类型,并且您必须声明Options为类型,而不是接口才能使其工作:

type  Options = object & {
    foo?: string;
    bar?: number;
};

function fooNction(opts: Options): void {
}

fooNction("hello"); //error
Run Code Online (Sandbox Code Playgroud)