2017-03-11 7 views
3

Ich habe Funktion ein Objekt als Parameter wie folgt aus:Typoskript 2.2 Schnittstellen erweitern Objekttyp

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

function fooNction(opts: Options): void { 
} 

Dies funktioniert in einigen Fällen in Ordnung, aber nicht alle:

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

Ich habe versucht, meine Schnittstelle zu erweitern von TS 2.2 Objekttyp wie diese

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

Grundtypen zu verbieten, aber Typoskript sagt: „Kann nicht schöner Name‚o bject '".

Gibt es eine Möglichkeit, eine Schnittstelle zu definieren, muss ein Objekt sein, aber hat kein Pflichtfeld?

Antwort

1

Aus irgendeinem Grund ist es nicht zulässig, eine Schnittstelle zu haben, die den eingebauten Typ wie object oder string erweitert. Sie können versuchen, dass ähnliche

type ObjectAlias = object; 

interface Options extends ObjectAlias { 
    ... 
} 

für object, indem er erklärt Typ alias zu umgehen, aber es immer noch nicht funktioniert, weil strukturelle Kompatibilität für Typprüfung Schnittstellen verwendet:

function fooNction(opts: Options): void { 
} 

fooNction("hello"); //ok 

So scheint es, wie object verwendbar ist Nur mit intersection types, und Sie müssen Options als einen Typ, nicht eine Schnittstelle zu erklären, damit es funktioniert:

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

function fooNction(opts: Options): void { 
} 

fooNction("hello"); //error 
Verwandte Themen