Как определить объект, который также является функцией (объект из интерфейса) в одном операторе без утверждения типа? - PullRequest
0 голосов
/ 16 января 2019

Поскольку в JavaScript функции также являются объектами, интерфейс TypeScript может быть одновременно (объектом и функцией) одновременно, например:

//TS:
interface ITest {
    (arg: any): void
    field: number
}

let test: ITest = ((arg: any) => { }) as ITest
test.field = 123
test("foo")
test.field = 456

//JS:
var test = (function (arg) { });
test.field = 123;
test("foo");
test.field = 456;

В строке let test: ITest = оно выиграло 'Я не жалуюсь на интерфейс, потому что я делаю утверждение типа для ITest.Тем не менее, я хотел бы определить весь объект в одном утверждении.Что-то вроде:

let test: ITest = { 
    ((arg: any) => { }), // Cannot invoke an expression whose type lacks a call signature
    field: 123,
}

Но не получается.Это вообще возможно?

1 Ответ

0 голосов
/ 16 января 2019

Насколько я понимаю, нет способа сделать это без утверждений типа. Документы для гибридных типов также используют его, например,

interface Counter {
    (start: number): string;
    interval: number;
    reset(): void;
}

function getCounter(): Counter {
    let counter = <Counter>function (start: number) { };
    counter.interval = 123;
    counter.reset = function () { };
    return counter;
}

let c = getCounter();
c(10);
c.reset();
c.interval = 5.0;
...