Как использовать параметры generi c в компоненте React? - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть приложение React, и я использую компоненты c, в состоянии у меня есть запись под названием query, которая содержит лямбда-выражение в качестве значения. Это функция для ручного добавления новой функции в состояние для создания цепочки исполняемых функций.

Пример:

f: a -> b
g: b -> c
Then we can make a function 
f_g: a -> c

Производство f_g будет выполнено с событием onClick, изменяющим состояние на новую функцию.

Мой компонент выглядит следующим образом:

type Props = {}
type State<T> = { value: number, q: Func<number, T> }
class GenericComponent<T> extends React.Component<Props, State<T>> {
    constructor(props: Props) {
        super(props)
        this.state = { q: Identity<number>(), value: 0 }
    }

    Incr = () => Func<number, number>(x => x + 1)
    Shout = () => Func<number, string>(x => x + '!')

    render() {
        return <div>
            <h1>Chaining a number function!</h1>
            <h3>Initial value: {this.state.value}</h3>
            <h3>Value: {this.state.q.f(this.state.value)}</h3>

            <button onClick={event => {
                this.setState({ ...this.state, q: this.state.q.then(this.Incr()) })
            }} >Add value</button>

            <button onClick={event => {
                this.setState({ ...this.state, q: this.state.q.then(this.Shout()) })
            }} >Shout</button>



            <button onClick={event => {
                this.setState({ ...this.state, q: Identity() })
            }}>
                Reset
            </button>
        </div>
    }
}

This code doesn't compile unless I change the `T` to `any`, Iget the following type error: 

Тип 'Fun c' нельзя назначить типу 'Fun c'.

Моя составная функция приведена ниже:

export interface Func<a, b> {
    f: (_: a) => b
    then: <c>(this: Func<a, b>, g: Func<b, c>) => Func<a, c>
    repeat: (this: Func<a, a>) => Func<number, Func<a, a>>
    repeatUntil: (this: Func<a, a>) => Func<Func<a, boolean>, Func<a, a>>
}

export let Func = <a, b>(f: (_: a) => b): Func<a, b> => {
    return {
        f: f,
        then: function <c>(this: Func<a, b>, g: Func<b, c>): Func<a, c> {
            return Func<a, c>(x => g.f(this.f(x)))
        }
    }
}

export let Identity = <a>(): Func<a, a> => Func(x => x)

Идентичность - это отправная точка функции, которая сразу же возвращает значение, но тип возвращаемого значения Func может быть переменной. У кого-нибудь есть идея инициализировать параметр generi c на основе типа возвращаемого значения функции chain?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...