我有一个使用对象作为参数的函数,如下所示:
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;
};
禁止基本类型,但是打字稿告诉“不能精确命名'对象'”。
有没有办法定义接口必须是一个对象但没有必填字段?
答案 0 :(得分:3)
出于某种原因,不允许使用扩展内置类型的界面,如object
或string
。您可以尝试通过声明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