从prop类型推断出接口的类型实参

时间:2019-12-14 10:26:47

标签: typescript

我想让TS从它的属性类型推断出通用接口的类型参数

sequelize.query('show tables').then(function(rows) {
    console.log(JSON.stringify(rows));
});

但这不适用于接口。 TS说

  

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

对于功能有效

interface I1<T> {
    prop: T
}

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

因此,对于函数TS而言,它仅推断类型实参,而对于接口而言,则不是。问题是,热使TS推断接口的类型参数吗?欢迎任何解决方法

2 个答案:

答案 0 :(得分:1)

声明新变量时,您需要输入B的类型

T

答案 1 :(得分:1)

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

唯一的解决方法(除了明确声明类型外)是使用一个函数,该函数在推断出内容方面更加灵活:

 $.post("exportGraphs", {
      esporta_tutto: JSON.stringify(jsonChart) 
 }).done(function() {

                        var fileName = jsonChart["id"] + ".txt";
                        var url = "/files/"+fileName;
                        var link = document.getElementById('a-esporta-grafico');
                        if (typeof link.download === 'string') {
                            link.download = fileName;
                            link.href = url;
                            link.setAttribute('style', 'text-decoration: none;')
                            //simulate click
                            link.click();

                            //remove the link when done
                            link.setAttribute("href", "#");
                        }
                    }).fail(function(xhr, ajaxOptions, thrownError) { 
                        alert(thrownError); 
                    });
                });

Playground Link

或者使用IIFE,尽管它对于可读性而言可能是可怕的:

interface I1<T> {
    prop: T
}

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

Playground Link