【问题标题】:Infer type argument of Interface from prop type从 prop 类型推断接口的类型参数
【发布时间】:2019-12-14 18:46:10
【问题描述】:

我想让 TS 从 it 属性的类型推断泛型接口的类型参数

interface I1<T> {
    prop: T
}

const i1: I1 = { prop: 'something' } // -> T is string

但这不适用于接口。 TS说

通用类型“I1”需要 1 个类型参数

这适用于功能

function f1<T>(arg: T): T { return arg }
const arg:string = 'something'
f1(arg) // returns string and T is string

所以对于函数 TS 只是推断类型参数,但对于接口它没有。问题是,hot make TS 推断接口的类型参数?欢迎任何解决方法

【问题讨论】:

    标签: typescript


    【解决方案1】:

    声明新变量时需要写T的类型

    const i1: I1<string> = { prop: 'something' }; // add <string>
    

    【讨论】:

    • 是的,我知道这行得通。但我希望 TS 从prop 的类型推断T 的类型。对于功能,这完全有效,但对于接口,这不起作用..
    【解决方案2】:

    变量的类型可以从类型注释中推断或指定。没有中间立场可以推断变量的部分类型。

    唯一的解决方法(除了明确类型之外)是使用一个函数,它在推断什么方面更加灵活:

    interface I1<T> {
        prop: T
    }
    
    function makeI1<T>(o: I1<T>) { return o}
    const i1 = makeI1({ prop: 'something' }) // const i1: I1<string>
    

    Playground Link

    或者使用 IIFE,尽管这对于可读性来说可能是可怕的:

    interface I1<T> {
        prop: T
    }
    
    const i1 = (<T>(o: I1<T>) => o)({ prop: 'something' }); // const i1: I1<string>
    

    Playground Link

    【讨论】:

    • 感谢您的回答。我不确定我是否理解“变量的类型是从类型注释推断或指定的。没有中间立场可以推断变量的部分类型。”你为什么说“推断变量类型的一部分”?创建I1 类型的对象时,我通过将值分配给prop 来指定T 的类型。这绝对指定 T 的类型
    • @Fyodor i1 的类型必须是 I1&lt;string&gt; 您只想指定 I1&lt;?&gt; 并让 ts 根据 value? 推断为字符串。这就是我的意思是全有或全无,你要么让i1 被完全推断出来,要么你将整个类型指定为I1&lt;string&gt;,你可以将它部分指定为I1&lt; ?&gt; 并让ts 填空
    • 只是出于好奇,为什么类型推断适用于函数而不适用于接口?当我从我的问题中使用f1('something') 时,TS 完美地推断T 是字符串。这与const i1:I1 = ( prop: 'something' }/ 的作用基本相同,对于函数,我传递参数和类型推断,但对于接口 - 不是
    猜你喜欢
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 2012-11-21
    相关资源
    最近更新 更多