Typescript自动泛型类型,不显式声明类型

Typescript自动泛型类型,不显式声明类型,typescript,typescript-generics,Typescript,Typescript Generics,如果我有一个带有两个函数的接口。一个函数返回一个值。我想在同一接口的另一个函数中使用值的类型。我确实使用泛型,但每次创建新对象时都必须显式声明类型。但是没有它也可以做到。例如: interface myObject<T> { create(): T update(value: T): void // use value type defined in create method } 接口myObject{ create():T 更新(值:T):void//使用cre

如果我有一个带有两个函数的接口。一个函数返回一个值。我想在同一接口的另一个函数中使用值的类型。我确实使用泛型,但每次创建新对象时都必须显式声明类型。但是没有它也可以做到。例如:

interface myObject<T> {
    create(): T
    update(value: T): void // use value type defined in create method
}
接口myObject{
create():T
更新(值:T):void//使用create方法中定义的值类型
}
在这里,我们使用上面的接口定义新对象:

let test: myObject<string> = {
    create() {
        return "Hello"
    },
    update(value) {
        // do something with value
    },
}
let测试:myObject={
创建(){
回复“你好”
},
更新(值){
//做有价值的事
},
}

可以在不使用
的情况下编写
myObject
。由于值类型已在
create
method?

初步命名约定中定义,请注意:标准做法是以大写字符开头非基元类型名称,以区别于变量/属性名称或基元类型。因此,在这个答案中,我将使用
myObject
,而不是
myObject

interface MyObject<T> {
    create(): T
    update(value: T): void
}

让我们测试一下:

let test = toMyObject(
    () => { return "Hello" },
    (value) => { console.log(value.toUpperCase()); }
);
// let test: MyObject<string>
let test=toMyObject(
()=>{返回“你好”},
(value)=>{console.log(value.toUpperCase());}
);
//let测试:MyObject
看起来不错。编译器推断
test
的类型为所需的
MyObject
,回调参数
value
也被推断为
string
(可以在
--strict
模式下调用
value.toUpperCase()
而不会出错)



请注意,非原语类型名称通常以大写字符开头,如
MyObject
中所述,而不是
MyObject
。我删除了我的答案,转而使用@jcalz的答案,我的是一些不必要的东西overhead@captain-yossarian这是不相关的回答我想要的不是对象创建,而是我想要在泛型中省略
,并自动使用
create
方法中的类型。为了避免编写不必要的代码并使事情变得更干净。@jcalz可以实例化命名类或任何东西的约定。在我的例子中,是的,我可以使用这个惯例。但与其他对象。像其他变量一样命名谢谢。但它仍然在复制函数参数中的代码。在我看来,它不如使用泛型论证本身那么干净。我在实际代码中有更多的方法。因此,我将避免您可能确实更喜欢自己指定泛型类型参数。但是“复制函数参数中的代码”只在函数定义中发生一次,然后您可以根据需要多次使用它,而无需进一步复制。单个函数定义的开销是否过大取决于您创建的对象数量。在任何情况下,目前都没有其他方法可以让编译器推断泛型
T
值的类型,因此可能的答案要么是这个,要么是“不,你不能这样做”。
let test = toMyObject(
    () => { return "Hello" },
    (value) => { console.log(value.toUpperCase()); }
);
// let test: MyObject<string>