我在为我试图编写的库函数编写类型时遇到了麻烦.当我的函数接受原始对象时,类型似乎被正确推断,但当它被更新为接受返回相同对象的函数时,类型就被 destruct 了.
该函数接受具有以下 struct 的Options对象:
interface Options<Key, Result> {
key: Key;
format(key: Key): Result;
}
该类型用于创建一个buildStore
函数(目前,它只是一个用于说明类型的标识函数).
function buildStore<Key, Result>(options: Options<Key, Result>) {
return options;
}
const store = buildStore({
key: {id: 32},
format(key) {
// key correctly inferrred as {id: number}
return key.id.toString();
}
});
// Result still correctly inferred as string
store.format({id: 10})
当我更新类型以直接传递构建器函数而不是Options对象时,这会中断:
function buildStore<Key, Result>(options: (...args: any[]) => Options<Key, Result>) {
return options();
}
const store = buildStore(() => {
return {
key: {id: 32},
format(key) {
// key is of type "unknown"
return key.id.toString();
}
}
});
// Property 'fn' does not exist on type '(...args: any[]) => Options<unknown, any>'.
store.format({id: 10})
我希望在从函数返回对象时仍能正确推断类型,但情况似乎并非如此.这是打字脚本的限制,还是我没有正确处理泛型?