Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 类型脚本:对象的键类型?_Typescript - Fatal编程技术网

Typescript 类型脚本:对象的键类型?

Typescript 类型脚本:对象的键类型?,typescript,Typescript,我想定义以下类型: type Item = { name: string, value: number | string } type ItemFilter<T extends Item> = { property: keyof Item; value: // ?????? I'd like to have here the type of Item[property] } 这里我要做的是值构造函数,它将为我们的对象生成适当的过滤器值。考虑代码:

我想定义以下类型:

type Item = {
    name: string,
    value: number | string
}


type ItemFilter<T extends Item> = {
    property: keyof Item;
    value: // ?????? I'd like to have here the type of Item[property]
}

这里我要做的是值构造函数,它将为我们的对象生成适当的过滤器值。考虑代码:

const makeFilter = <T extends Record<string, any>> (item: T) => <K extends keyof T>(property: K, value: T[K]) => {
    return {
        property,
        value
    }
}

// TESTS
const myItem = {
    name: 'phoneNumber',
    value: 1111111,
}

const filter = makeFilter(myItem) // create function for specific object filtering

filter('value', 1231)  // ok
filter('value', 'a') // error as expected
filter('name', 1231)  // erorr as expected
filter('name', 'fine') // ok
constmakefilter=(项:T)=>(属性:K,值:T[K])=>{
返回{
财产,,
价值
}
}
//测验
常量myItem={
姓名:'电话号码',
价值:1111111,
}
const filter=makeFilter(myItem)//为特定对象筛选创建函数
过滤器('value',1231)//确定
筛选器('value','a')//按预期出现错误
筛选器('name',1231)//erorr如预期
过滤器('name','fine')//确定
请注意,我们甚至不再需要任何
类型,解决方案将适用于每个对象

一些解释:

  • makeFilter
    是一个通过参数派生类型的函数
  • 它首先得到我们的初始对象和返回函数,该函数只有这个特定对象类型的参数
  • filter=makeFilter(obj)
    为特定对象创建所需的过滤器构造函数
  • 在参数中使用
    filter
    after已经正确地缩小了类型
  • property:K,value:T[K]
    表示值需要是键下对象的值-
    K
为什么我直接使用函数而不是类型。 函数允许我们对参数进行类型推断,所以我们不需要重复冗余的类型。我们只是为想要的对象制作过滤器


不完全是这样,但这能解决您的问题吗?
const makeFilter = <T extends Record<string, any>> (item: T) => <K extends keyof T>(property: K, value: T[K]) => {
    return {
        property,
        value
    }
}

// TESTS
const myItem = {
    name: 'phoneNumber',
    value: 1111111,
}

const filter = makeFilter(myItem) // create function for specific object filtering

filter('value', 1231)  // ok
filter('value', 'a') // error as expected
filter('name', 1231)  // erorr as expected
filter('name', 'fine') // ok