Typescript: выводить тип без расширения в области интерфейса

Я не уверен, достаточно ли это декларативно, но мне нужно вывести тип внутри области интерфейса и использовать его в той же области, что и аргумент метода. Вот простой пример

interface Prop {
    x: infer U,
    // ^^^^^^^ store type coming from 'x'
    validate: (x: U) => U
    //            ^ use type
}

interface IState {
    [key: string]: Prop
}

и использовать

const state:IState = {
    asString: {
        x: '',
        validate: value => value + ' is string',
        //        ^^^^^ string
    },
    asBoolean: {
        x: true,
        validate: value => !value;
        //        ^^^^^ boolean
    }
}

Это вообще возможно?

1 ответ

Решение

Это не совсем то, что вы хотите, но вы можете сделать:

interface Prop<U> {
    x: U,
    validate: (x: U) => U
}

function makeProp<U>(x: U, validate: (x: U) => U): Prop<U> {
    return { x, validate }
}

const state = {
    asString: makeProp('', value => value + ' is string'),
    asBoolean: makeProp(true, value => !value)
}
// Here, 'state' is of type: { asString: Prop<string>, asBoolean: Prop<boolean> }
Другие вопросы по тегам