允许 TypeScript 从工厂推断类型
Allowing TypeScript to infer type from a factory
TypeScript 是否可以从静态函数中推断出 return 类型。例如,如果我有一个静态 User.fromId()
函数,它将 return 一个 User
对象。但我想通过另一个函数传递它(称之为 builder
)——例如:
builder(User.fromId, values);
其中 builder
定义为:
function builder( construct: Function, values: any ) {
var inst = construct();
// set values
return inst;
}
我怎样才能让 TypeScript 变成 "know" 而 builder
将变成 return 一个 User
而不通过 User
作为泛型?也许可以,但是问题是使用 Function
作为第一个参数的类型吗?如果是这样,是否可以在没有泛型的情况下进行推理,我知道我可以用它来定义 return 类型(但感觉多余)。
谢谢!
如果您使用泛型类型参数和适当的函数签名,Typescript 将正确推断类型
class User {
static fromId(id: number): User{
return new User()
}
}
function builder<T>(construct: (id:number) => T, values: any) {
var inst = construct(values);
// set values
return inst;
}
let u = builder(User.fromId, 0); //User
必要时我们甚至可以推断参数类型
function builder<T, TId>(construct: (id:TId) => T, values: TId) {
var inst = construct(values);
// set values
return inst;
}
let u = builder(User.fromId, 0);
let u2 = builder(User.fromId, '0'); // error
如果构造函数有更多参数,我们甚至可以在需要时推断这些参数,在剩余参数中使用元组
class User {
static fromId(id: number, name: string): User{
return new User()
}
}
function builder<T, TArgs extends any[]>(construct: (...a:TArgs) => T, ...values: TArgs) {
var inst = construct(...values);
// set values
return inst;
}
let u = builder(User.fromId, 0, '');
let u2 = builder(User.fromId, '0'); // error
TypeScript 是否可以从静态函数中推断出 return 类型。例如,如果我有一个静态 User.fromId()
函数,它将 return 一个 User
对象。但我想通过另一个函数传递它(称之为 builder
)——例如:
builder(User.fromId, values);
其中 builder
定义为:
function builder( construct: Function, values: any ) {
var inst = construct();
// set values
return inst;
}
我怎样才能让 TypeScript 变成 "know" 而 builder
将变成 return 一个 User
而不通过 User
作为泛型?也许可以,但是问题是使用 Function
作为第一个参数的类型吗?如果是这样,是否可以在没有泛型的情况下进行推理,我知道我可以用它来定义 return 类型(但感觉多余)。
谢谢!
如果您使用泛型类型参数和适当的函数签名,Typescript 将正确推断类型
class User {
static fromId(id: number): User{
return new User()
}
}
function builder<T>(construct: (id:number) => T, values: any) {
var inst = construct(values);
// set values
return inst;
}
let u = builder(User.fromId, 0); //User
必要时我们甚至可以推断参数类型
function builder<T, TId>(construct: (id:TId) => T, values: TId) {
var inst = construct(values);
// set values
return inst;
}
let u = builder(User.fromId, 0);
let u2 = builder(User.fromId, '0'); // error
如果构造函数有更多参数,我们甚至可以在需要时推断这些参数,在剩余参数中使用元组
class User {
static fromId(id: number, name: string): User{
return new User()
}
}
function builder<T, TArgs extends any[]>(construct: (...a:TArgs) => T, ...values: TArgs) {
var inst = construct(...values);
// set values
return inst;
}
let u = builder(User.fromId, 0, '');
let u2 = builder(User.fromId, '0'); // error