Typescript 有没有一种方法来描述一种;keyfor";打字稿?

Typescript 有没有一种方法来描述一种;keyfor";打字稿?,typescript,type-constraints,keyof,Typescript,Type Constraints,Keyof,有没有办法表示对象的键属性应该受到相关值的限制?等同于keyof但与给定键相关的值 const objectAction = <T extends object>(obj: T): void => obj; const onlyForObjects = <T extends object>(obj: T, key: keyof T): void => objectAction(obj[key]) constobjectaction=(obj:T):voi

有没有办法表示对象的键属性应该受到相关值的限制?等同于keyof但与给定键相关的值

const objectAction = <T extends object>(obj: T): void => obj;
const onlyForObjects = <T extends object>(obj: T, key: keyof T): void =>
  objectAction(obj[key])
constobjectaction=(obj:T):void=>obj;
const only for objects=(对象:T,键:keyof T):void=>
objectAction(obj[键])
应该有用

onlyForObjects<{ a: number, b: object }>({ a: 0, b: {} }, 'b');
onlyForObjects({a:0,b:{},'b');
不应该起作用

onlyForObjects<{ a: number, b: object }>({ a: 0, b: {} }, 'a');
onlyForObjects({a:0,b:{},'a');

如果我正确理解了你的问题,那么以下是你想要的:

type ObjKeys={
[P in keyof T]:T[P]扩展记录?P:从不
}[keyof T]
constObjectAction=(obj:T):void=>console.log(obj)
constonlyforobjects=(obj:T,key:ObjKeys):void=>objectAction(obj[key])
仅用于对象({a:0,b:{},'b')//编译
仅对象({a:0,b:{},'a')//未编译

如果我正确理解了你的问题,那么以下是你想要的:

type ObjKeys={
[P in keyof T]:T[P]扩展记录?P:从不
}[keyof T]
constObjectAction=(obj:T):void=>console.log(obj)
constonlyforobjects=(obj:T,key:ObjKeys):void=>objectAction(obj[key])
仅用于对象({a:0,b:{},'b')//编译
仅对象({a:0,b:{},'a')//未编译

您可以使用泛型for type参数
T

const onlyForObjects = <T extends Record<K, object>, K extends string>(
    obj: T, key: K): void => { }

onlyForObjects({ a: 0, b: {} }, 'b'); // works
onlyForObjects({ a: 0, b: {} }, 'a'); // error
const only for objects=(
obj:T,key:K):void=>{}
仅适用于对象({a:0,b:{},'b');//作品
仅适用于对象({a:0,b:{},'a');//错误

下面是一个。

您可以使用泛型for type参数
T
来实现这一点:

const onlyForObjects = <T extends Record<K, object>, K extends string>(
    obj: T, key: K): void => { }

onlyForObjects({ a: 0, b: {} }, 'b'); // works
onlyForObjects({ a: 0, b: {} }, 'a'); // error
const only for objects=(
obj:T,key:K):void=>{}
仅适用于对象({a:0,b:{},'b');//作品
仅适用于对象({a:0,b:{},'a');//错误

这是一个。

您的意思是,传递给
onlyForObjects
的第二个参数应该只接受保存对象的键吗?您的意思是,传递给
onlyForObjects
的第二个参数应该只接受保存对象的键吗?在这种情况下,错误出现在第一个参数,而不是第二个参数。这意味着,如果我只对对象({a:0,b:{},c:'foo'},'x')执行此操作,则此函数的使用者将无法传递具有顶级键和相应基元值的对象。,我得到的错误是(这不是我认为预期的):错误TS2322:类型“number”不可分配给类型“object”。错误TS2322:类型“string”不可分配给类型“object”。我不太明白您的意思。看看操场的第一个示例行:
onlyForObjects({a:0,b:{},c:foo},'b')。属性
a
有一个基元值类型-它按预期工作。您会得到错误(当传递无效的第二个参数时),这很好。但是,由于实现的原因,您得到的错误消息具有误导性。这也是预期的效果。我们不能选择给定对象类型(如
x
)上不存在的键。在这种情况下,错误出现在第一个参数,而不是第二个参数。这意味着,如果我只对对象({a:0,b:{},c:'foo'},'x')执行此操作,则此函数的使用者将无法传递具有顶级键和相应基元值的对象。
,我得到的错误是(这不是我认为预期的):错误TS2322:类型“number”不可分配给类型“object”。错误TS2322:类型“string”不可分配给类型“object”。我不太明白您的意思。看看操场的第一个示例行:
onlyForObjects({a:0,b:{},c:foo},'b')。属性
a
有一个基元值类型-它按预期工作。您会得到错误(当传递无效的第二个参数时),这很好。但是,由于实现的原因,您得到的错误消息具有误导性。这也是预期的效果。我们不能选择给定对象类型上不存在的键(如
x
)。