繁体   English   中英

具有已知属性的 Typescript 对象

[英]Typescript object with a known property

帮助定义泛型,它接受Object with type T K property key in T并返回类型化的T

我试图弄清楚如何使用 TypeScript 4 解决它:

  1. 它解决了问题,但返回object 这不是很好的解决方案。
type WithProp<TKey extends string> = { [K in TKey]: object };

游乐场

  1. 相同,但返回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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM