【问题标题】:How to infer subtype of generic in TypeScript?如何在 TypeScript 中推断泛型的子类型?
【发布时间】:2020-10-11 04:58:40
【问题描述】:

我有一个具有某些参数类型的函数:

function func<T extends {field1: string}>(arg1: T) {
 // function's code
}

我有一个熟悉的泛型接口,如下所示:

interface SomeInterface<T> {
    field1: string;
}

现在我想推断接口的泛型参数并将其分配给函数的返回类型:

const value1: SomeInterface<number> = {field1: "Hello"};

const res1 = func(value1);

我需要 res1 的类型是 number

我需要使用什么函数签名?

function func<T extends {field1: string}>(arg1: T) : T extends ???? { // What?

【问题讨论】:

    标签: typescript typescript-generics


    【解决方案1】:

    如果类型没有被任何属性引用,那么在接口中使用泛型类型是没有意义的。

    这是一个接收泛型类型并将该类型应用于其属性之一的接口:

    interface SomeInterface<T> {
        field1: T;
    }
    

    另一方面,如果您想创建具有通用返回类型的函数:

    function func<T>(): T {
     // code
    }
    
    // function call
    const res1 = func<number>();
    
    

    最后,如果你希望你的函数接收一个泛型类型作为参数并返回另一个泛型类型:

    function func<T, R>(arg: T) : R {
     // code
    }
    
    // function call
    const res1 = func<SomeInterface, number>(value1);
    
    

    【讨论】:

    • 对不起,但这是有道理的。例如:interface SomeInterface&lt;_T&gt;{ field1: string; } function func1&lt;T&gt;(arg: T): T extends SomeInterface&lt;infer R&gt; ? R : never { } const value1: SomeInterface&lt;number&gt; = {field1: "hello"}; const res1 = func1(value1); // res1 has type a number
    • @Alisa see this FAQ entry。如果泛型类型G&lt;T&gt; 没有在其结构中使用其类型参数T,那么您就不能指望编译器跟踪它。
    猜你喜欢
    • 2017-10-04
    • 2018-01-18
    • 1970-01-01
    • 2019-09-17
    • 2020-07-23
    • 2021-07-28
    • 2020-09-09
    • 2016-12-05
    • 1970-01-01
    相关资源
    最近更新 更多