Можно ли определить функцию со свойствами в TypeScript без утверждения типа или промежуточного? - PullRequest
1 голос
/ 27 мая 2019

TypeScript позволяет вам определить интерфейс, который может быть вызван и имеет свойства:

interface FnWithProps {
    (x: number): number;
    a: string;
    b: string;
}

Вот один из способов создания значений, назначаемых этому интерфейсу:

function double(x: number) {
    return x * x;
}
double.a = 'Hello';
double.b = 'Goodbye';

let f: FnWithProps = double;  // ok

Если double.a или double.b не установлены, это вызывает ошибку.

Можно ли построить такое значение напрямую, без прохождения промежуточного или использования утверждения типа?

Это недопустимый TypeScript и вызывает всевозможные ошибки:

let g: FnWithProps = {
    (x: number) => x,
    a: 'Hello',
    b: 'Goodbye',
};

1 Ответ

1 голос
/ 27 мая 2019

Я думаю, что промежуточное решение, вероятно, является лучшим, поскольку оно хорошо работает и для перегрузок, но вы также можете использовать Object.assign для получения аналогичного эффекта:

let f: FnWithProps = Object.assign(function double(x: number) {
    return x * x;
},{
    a : 'Hello',
    b : 'Goodbye'
}); 

Хотя это означает, что мы не получаем вывод для параметров функции или свойств.

Если это обычный сценарий для вас, мы можем построить служебную функцию, чтобы получить заключение для всего:

interface FnWithProps {
    (x: number): number;
    a: string;
    b: string;
}

function functionWithProps<T extends (...a: any[]) => any>(fn: (...a: Parameters<T>) => ReturnType<T>, props: Pick<T, keyof T>){
    return Object.assign(fn, props);
}

let f = functionWithProps<FnWithProps>(function double(x) { // annotation not necesary
    return x * x;
},{
    a : 'Hello', // helpful intelisense here
    b : 'Goodbye'
}); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...