#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 }