【问题标题】:Force argument object with a certain key使用某个键强制参数对象
【发布时间】:2021-04-08 08:08:35
【问题描述】:

这似乎是一件相当简单的事情,但我尝试了多种方式搜索,但找不到答案。

我想为参数指定一个类型,该类型允许任何包含特定键的对象,如下所示:

type Action = {type : string};
function reducer(state : object, action : object extends Action) {
    ...
};

类似这样的东西,但是这种语法不起作用。也就是说,我希望 action 参数只接受包含作为字符串的键“type”的对象。如果我这样做:

function (state : object, action : {type : string}) {...};

该函数只接受只有键“type”的对象。我怎样才能做到这一点?

提前致谢。

【问题讨论】:

    标签: typescript types


    【解决方案1】:

    您可以为此使用泛型:

    function testFn<T extends { type: string }>(obj: T) {
      return obj;
    }
    
    testFn({ a: 2, type: 'hey' }); // Fine
    testFn({ type: 'hello' }); // Fine
    
    testFn({ a: 2 }); // Type error
    testFn({ a: 2, type: 3 }); // Type error
    

    【讨论】:

    • 嗯,很有趣。但我认为泛型必须类似于参数传递。为什么我不必将类型传递给 testFn,如:testFn&lt;ActionWithMore&gt;({type: 'foo', more: 'stuff'})
    • TypeScript 足够聪明,可以根据输入参数推断泛型。它看到传入的obj 的类型,然后确保它扩展了我们所说的 T 必须扩展的内容。更多信息:stackoverflow.com/questions/54225839/…
    • 好的,很酷。我接受了你的回答,因为它回答了我的问题。但我现在意识到我过于简化了我的问题,所以它的答案实际上并不能帮助我解决我的问题,所以我想我不得不问另一个问题,它提供了更多关于真实情况的细节。
    猜你喜欢
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 2013-08-25
    • 2011-03-19
    相关资源
    最近更新 更多