2017-03-11 55 views
3

我使用一個對象作爲參數,像這樣具有功能:打字稿2.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; 
}; 

禁止基本類型,但typescript告訴「不能罰款名稱」o bject'」。

是否有任何方法來定義接口必須是一個對象,但沒有必填字段?

回答

1

出於某種原因,不允許有擴展內置類型的接口,如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