【问题标题】:Can I infer a tuple type from a function's return type, without using 'as const'?我可以从函数的返回类型推断元组类型,而不使用'as const'吗?
【发布时间】:2020-08-21 14:49:09
【问题描述】:

我想使用一个构造数组作为参数的函数,其中每个元素可能是不同的类型。类型的顺序是相关的,我需要将它们的顺序保留为元组。这是一种方法:

const create = <T>(spec: (...args: any[]) => T) => spec;
const result = create(() => ['a', 2, 'a'] as const);
type t = ReturnType<typeof result>; // t is ['a', 2, 'a']

但是,这意味着开发人员必须记住在每次使用 create 时添加 as const

在我的用例中,类型的顺序是总是相关的,函数应该总是接收一个元组。

有什么方法可以强制 Typescript 始终从返回类型推断元组而不需要 as const

【问题讨论】:

    标签: typescript


    【解决方案1】:

    如果将泛型类型参数的约束指定为[any] | any[],则可以提示编译器应将泛型类型参数推断为元组类型。

    const create = <T extends [any] | any[]>(spec: (...args: any[]) => T) => spec;
    const result = create(() => ['a', 2, 'a']);
    type t = ReturnType<typeof result>; // t is [string, number, string]
    
    

    Playground Link


    似乎无法推断出 ['a', 2, 'a'] 等字面常量。

    【讨论】:

    • 太棒了!非常感谢!
    • 嘿,我意识到这实际上并没有返回 const 文字 'a', 2, 'a'... 但是 [string, number, string]
    • @SebastianNemeth 是的,你是对的,对此感到抱歉。不幸的是,在这种情况下无法真正找到保留文字的方法,由于某种原因,我通常的技巧不适用于返回类型
    • 是的,我也得出了同样的结论……我会更新你的答案并标记它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    相关资源
    最近更新 更多