typescript 2.2接口扩展了对象类型

时间:2017-03-11 00:07:13

标签: typescript typescript2.2

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

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

function fooNction(opts: Options): void {
}

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

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

我试图从TS 2.2对象类型扩展我的界面,就像这样

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

禁止基本类型,但是打字稿告诉“不能精确命名'对象'”。

有没有办法定义接口必须是一个对象但没有必填字段?

1 个答案:

答案 0 :(得分:3)

出于某种原因,不允许使用扩展内置类型的界面,如objectstring。您可以尝试通过声明object的类型别名来绕过它

type ObjectAlias = object;

interface Options extends ObjectAlias {
   ...
}

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

function fooNction(opts: Options): void {
}

fooNction("hello"); //ok

所以似乎object仅适用于intersection types,您必须将Options声明为类型,而不是使其有效的接口:

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

function fooNction(opts: Options): void {
}

fooNction("hello"); //error