9

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

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

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

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

4

1 回答 1

8

出于某种原因,不允许有一个扩展内置类型的接口,如objector string。您可以尝试通过声明类型别名来绕过object

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
于 2017-03-11T00:30:17.527 回答