首页 > 解决方案 > 创建引用自身的类型/接口

问题描述

这是一个简单的例子:

操场

这是问题:

(参数)独奏:未知

function entityWrapper22<T extends { [K in keyof T]: {
    keys: Array<keyof T>,
    fn: (solo: T[K]['keys']) => any,
} }>(t: T) {
    return t
}
const vraw = entityWrapper22({
    age: {
        keys: [],
        fn: () => 33
    },
    name: {
        keys: [],
        fn: () => 'thomas',
    },
    numberString: {
        keys: ['age'],
        fn: (solo) => solo
    },
})

更复杂的例子:

我有一个函数entityWrapper,我正在尝试键入它,以便get.every使用同名属性的返回值键入函数( 的第二个参数)。

例如,{ name }应该是类型string,甚至是thomas因为它​​的推断类型。

const raw = entityWrapper({
    age: get.every([], () => 33),
    name: get.every([], () => 'thomas'),
    numberString: get.every(['name'], ({ name }) => '212'),
})

我已经创建了两次尝试来创建引用本身都不能按预期工作的类型

游乐场链接

我这里有一个例子,它是一个type.

type EntityItem<T extends any> = {
    [K in keyof T]: {
        keys: Array<keyof T>,
        some?: Function,
        first?: Function
        every?: (solo: MapReturnTypesArray<T, T[K]['keys']>) => any,
    }
}

另一个在这里使用interface.

interface Entity<T extends Entity<T>> { 
    [key: string]: Item<T>
}

interface Item<T extends Entity<T>> {
    keys: Array<keyof T>,
    some?: Function,
    first?: Function
    every?: (solo: MapReturnTypesArray<T, this['keys']>) => any,
}

这两个似乎都无法正常工作,并将密钥注册为never[]每个。

对于更多上下文get.every,所做的就是将道具分配给一个对象。

const get = {
    every: <A, B> (keys: A, every: B) => ({ keys, every }),
    some: <A, B> (keys: A, some: B) => ({ keys, some }),
    first: <A, B> (keys: A, first: B) => ({ keys, first }),
}

错误是:

类型“MapReturnTypesArray”上不存在属性“名称”

标签: typescript

解决方案


推荐阅读