Samuel Hudec
Samuel Hudec

Reputation: 75

Typescript: passing function as type in interface

I am trying to figure out how to get type out of existing Typescript function and use it to define interface. I am working on React project and I want to pass action creator (function) to Props interface and then into React Component as Component<Props, State>.

Example action creator:

export function myFunction(foo: string = "bar") {
    return {
        type: "EXAMPLE_ACTION",
        payload: foo,
    }
}

Example component:

import React, { Component } from 'react'
import { connect } from "react-redux"
import { myFunction } from "actions"

export interface Props {
    // This is what I'm trying to and and it ends up in ts error
    myFunc: myFunction
}

class SomeComponent extends Component<Props, {}> {
    render() {
        return (
            <div>
                Example:
                <button onClick={this.props.myFunc("baz")}>Click to dispatch</button>
            </div>
        )
    }
}

export default connect(null, {
    myFunction
})(SomeComponent)

I was thinking this could work, but frankly it's a typescript error:

[ts] Cannot find name 'myFunction'

I was wondering if i have to define a separate type to pass it to my component, something like this:

export type myFuncType = (foo: string) => { type: string, payload: string }
export const myFunction: myFuncType = (foo: string) => {
    return {
        type: "EXAMPLE_ACTION",
        payload: foo,
    }
}

but that seems too verbose and redundant and would need to import another export. Is there any other way around this?

Upvotes: 4

Views: 9031

Answers (1)

Aluan Haddad
Aluan Haddad

Reputation: 31823

You can use the typeof keyword in type position to obtain the type of a named value.

In this case you would write

import { myFunction } from "actions";

export interface Props {
    myFunc: typeof myFunction;
}

The reason you currently receive an error is that TypeScript has two distinct declaration spaces, one for values and one for types. function defines a value but not a type.

Upvotes: 6

Related Questions