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>