Интерфейсы typescript 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;
};

чтобы запретить базовые типы, но машинописный текст сообщает: «Не удается точно назвать объект».

Есть ли способ определить, что интерфейсы должны быть объектом, но не иметь обязательного поля?


person Flarna    schedule 11.03.2017    source источник


Ответы (1)


По какой-то причине не разрешено иметь интерфейс, расширяющий встроенный тип, например object или 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
person artem    schedule 11.03.2017