TypeScript 2.2 接口扩展对象类型

11

我有一个使用对象作为参数的函数,像这样:

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;
};

如何禁止使用基本类型,但 TypeScript 却提示 "无法找到名称 'object'"?

是否有办法定义一个必须是对象但没有强制字段的接口?

1个回答

12

由于某些原因,不允许有一个扩展内置类型像object或者string的接口。你可以尝试通过声明类型别名来绕过这个问题,如下所示:

type MyObject = object;

在这种情况下,你可以使用MyObject作为你的接口扩展。

type ObjectAlias = object;

interface Options extends ObjectAlias {
   ...
}

但仍然无法工作,因为结构兼容性用于接口的类型检查:

function fooNction(opts: Options): void {
}

fooNction("hello"); //ok

看起来像是只有在交叉类型中才能使用object,而且你必须将Options声明为类型而不是接口才能使其工作:

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

function fooNction(opts: Options): void {
}

fooNction("hello"); //error

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接