Как указать возвращаемый тип функции в качестве типа пространства имен в TypeScript, чтобы могло появиться предложение

#typescript #typescript3.0

#typescript #typescript3.0

Вопрос:

 export namespace maths {
    export function add(payload) {
        console.log(payload);
    }
    export function subtract(payload) {
        console.log(payload);
    }    
    export function multiply(payload) {
        console.log(payload);
    }      
}

export const returnNewobj = (obj, name: string) => {
    return Object.assign(obj, { name });
};

const mathsFunction = returnNewobj(maths, "mathsFunction");
mathsFunction.  // it doesn't suggest the function inside the mathsFunction
  

Я хочу, чтобы mathsFunction показывала все доступные функции.

Мы можем решить это, используя приведенный ниже подход, но тогда проблема заключается в том, что всякий раз, когда мы добавляем новый метод в пространство имен maths, он не предлагает, пока мы не добавим его в интерфейс IMaths

 interface IMaths {
    add: (payload: number) => string;
    substract: (payload: number) => number;
}

const returnNewobj = (actions): IMaths => {
    return actions;
}

const mathsFunction = returnNewobj(maths);
mathsFunction.add(10); // here it shows the suggestion but the issue is we manuly have to sync namespace and type
  

Редактировать 1:

Также есть ли какой-либо способ перенаправить этот тип компоненту react? чтобы всякий раз, когда мы обращаемся к нему из props, он должен показывать список всех этих функций?

 interface IAppProps {
   actions: any;   // how to forwarded returnNewobj type to this interface?
}

    export class App extends React.Component<AppProps,AppState> {
        constructor(props) {
            super(props);
        }

        fireAction(): void {
            this.props.actions. // should list all those functions which is in namespace
        }
        render() { return () }
    }
    
    const mapDispatchToProps = (dispatch, props) => {
        return { actions: returnNewobj(maths) };
    };
    
    export default connect(null, mapDispatchToProps)(AppComponent);
  

Ответ №1:

Вам нужно сделать returnNewobj generic, чтобы перенаправить тип целевого объекта в результат:

 export const returnNewobj = <T,>(obj:T, name: string) => {
    return Object.assign(obj, { name });
};
  

Ссылка на игровую площадку

Примечание: Не используйте пространства имен, современные модули обычно являются лучшим решением.

Комментарии:

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

2. @AkashVishwakarma, только если вы вводите actions как typeof maths amp; { name: string }