Я пытаюсь сделать домашнюю цепочку сопоставления функций. Дело в том, что я хочу убедиться, что набор текста остается согласованным в цепочке отображения. Моя проблема в том, что я не умею писать f(x:T) => U
Для правильного примера того, что я пытаюсь сделать:
function myChainer<T>(args:T){
return {
map:(innerFuction:(payload: T) => unknown){
return myChainer(innerFuction(args))
}
}
}
Теперь, если я побегу
myChainer(0)
.map((args1) => {
return doSomething(args1) ? "a" : "b"
})
.map((args2) => {
return doSomething2(args2) ? true : false
})
Первый map
будет знать, что тип args1
— это Number
, а второй не будет знать, что тип args2
— это string
. И, как и ожидалось, последующие связанные функции не будут знать типы своих соответствующих аргументов. На что следует заменить unknown
, чтобы каждая цепочка функций определяла тип своих аргументов на основе возвращаемого типа ранее связанной функции?
Второй общий тип, U, нигде не задан. Это должно быть в методе карты, поэтому внутренняя функция может быть T => U: typescriptlang.org/play?#code/….
@jonrsharpe Где должен быть установлен U
? Я бы хотел установить его где-нибудь в myChainer
, чтобы все новые отображаемые функции могли определять типы параметров из возвращаемого значения предыдущей функции.
Вам нужно использовать параметр универсального типа для ссылки на любой возвращаемый тип innerFunction
, чтобы вы могли затем предоставить этот тип TS, когда вы рекурсивно ссылаетесь на myChainer
.
Вот как это будет выглядеть:
function myChainer<T>(args:T){
return {
map<U>(innerFuction:(payload: T) => U) {
return myChainer<U>(innerFuction(args))
}
}
}
Здесь у вас есть:
function myChainer<T>(args: T) {
return {
map: <R,>(innerFuction: (payload: T) => R) => {
return myChainer(innerFuction(args))
}
}
}
const foo = (arg: number) => arg.toString()
const bar = (arg: string) => Promise.resolve(parseInt(arg, 10))
const baz = (arg: Promise<number>) => arg
const result = myChainer(0)
.map(arg => foo(arg)) // arg -> number
.map(arg => bar(arg)) // arg -> string
.map(arg => baz(arg)) // arg -> Promise<number>
.map(arg => foo(arg)) // expected error
@GregL был быстрее)
Пожалуйста, поделитесь воспроизводимым кодом