【问题标题】:Typescript object with a known property具有已知属性的打字稿对象
【发布时间】:2020-12-17 06:27:40
【问题描述】:

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

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

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

Playground.

  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};

Playground.


用法:

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' 除外)调用助手必须抛出错误。

请帮忙写一个助手。

【问题讨论】:

  • 你能在TypeScript Playground提供一个(失败的)例子
  • const prop = &lt;K extends string | number&gt;(prop: K) =&gt; &lt;T extends {[P in K]: any}&gt;(model: T): T[K] =&gt; model[prop];
  • @Qurben 我已经提供了。

标签: javascript typescript typescript-generics


【解决方案1】:

如果我理解这个问题,那么检查 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; }'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-03
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    相关资源
    最近更新 更多