![](/img/trans.png)
[英]Typescript - How to declare anonymous object with known properties?
[英]Typescript object with a known property
帮助定义泛型,它接受Object with type T
K property key in T
并返回类型化的T
。
我试图弄清楚如何使用 TypeScript 4 解决它:
object
。 这不是很好的解决方案。type WithProp<TKey extends string> = { [K in TKey]: object };
游乐场。
any
。 最好写一些类似T[K]
东西,但 TS 说TS2536: Type 'K' cannot be used to index type 'T'
。type WithProp<T, K extends string | number> = T & {[keyToSort in K]: any};
游乐场。
用法:
const prop = <K extends string | number>(prop: K) => <T>(model: WithProp<T, K>) => model[prop];
const x = {foo: 'bar', baz: 'qux'};
typeof prop('foo')(x) === typeof x.foo;
并且在x
上使用任何键( 'foo'
或'baz'
除外)调用 helper 必须抛出错误。
请帮忙写一个助手。
如果我理解这个问题,那么检查T
包含属性K
条件就是你想要的。 尝试:
type WithProp<T, K extends string|number> = T extends { [k in K]: any } ? T : never
然后与您的代码一起使用:
function prop<K extends string | number>(prop: K) {
return function<T> (model: WithProp<T, K>) {
return model[prop];
}
}
const x = { foo: 'bar', baz: 'qux' };
typeof prop('foo')(x) === typeof x.foo; // Works
prop('blah')(x); // Error, argument is not assignable to never
不是最具描述性的错误消息,但它完成了工作。
为了更好的错误信息,我们可以稍微重写一些东西,而不是WithProp
我们可以将约束放在模板参数列表中。
function prop<K extends string | number>(prop: K) {
return function<T extends { [k in K]: any }> (model: T) {
return model[prop];
}
}
现在我们将得到:
prop('blah')(x) // Error, Property 'blah' is missing in type '{ foo: string; baz: string; }' but required in type '{ blah: any; }'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.