【发布时间】:2021-10-29 09:54:20
【问题描述】:
我需要对SomeType 类型属性有一个迭代器。 Object(instance) 不行,因为它返回 string[] 而不是 Array<keyof SomeType>。下面的函数解决了问题
export function keysof<T>(obj: Partial<Record<keyof T, any>>): Array<keyof T> {
return Object.keys(obj) as Array<keyof T>;
}
我真正不喜欢这里的是obj 参数似乎是多余的,因为类型应该足以获取它的属性。我希望能够执行以下操作
export function keysof<T>(): Array<keyof T> {
return Object.keys(T) as Array<keyof T>;
}
但显然这会抛出 'T' only refers to a type, but is being used as a value here 编译错误。
是否可以避免将SomeType 实例传递给函数?
【问题讨论】:
-
为了调用
Object.keys,你应该有一个对象。因此,您have将此对象作为参数传递给keysof函数。泛型类型T在编译后被删除。这意味着您正在尝试这样做:Object.keys()。您对此有何期待? -
seem to be redundant- 这不是真的。obj参数是required -
@captain-yossarian 好点。当我说冗余时,我的意思是我们只使用
obj的类型,因此我们实际上将类型传递了两次。但是,是的,你是对的,T只存在于 ts 编译之前,所以看起来不可能删除这个“冗余” -
“我们实际上将类型传递了两次”是什么意思?两次在哪里?你的意思是
declare function f<T>(x: T): void;提到T两次?如果是这样,请注意x => x * 3两次提到x,但您不会称其为“冗余”,当然也不能用x => * 3替换它。还是你的意思是别的? -
@jcalz 早上好:D
标签: typescript