Typescript:使用typeof和泛型



我有以下场景:

// Some library
interface Bar<T> {
something: T
}
export function foo<T>(b: Bar<T>) {}
// In my code
function anotherFoo(param1: ???) {
MyLib.foo(param1);
}

其中???是未知的

Bar没有导出,所以直觉上我尝试了:

type param<T> = Parameters<typeof foo<T>>[0];
function anotherFoo<X>(param1: param<X>) {
MyLib.foo(param1);
}

type的定义是非法的。

当使用type param = Parameters<typeof foo>[0];时,typeof似乎可以推断unknown,即Bar<unknown>

???应该是什么?

编辑:我的实际场景

import { Observable, of } from 'rxjs';
import { useDispatch, useSelector } from 'react-redux';
type Items = string[];
interface AppStore {
items: Items
}
type SelectFn = Parameters<typeof useSelector>[0];
function useSelectorAsStream<T>(selectFn: SelectFn) {
const items = useSelector<AppStore, T>(selectFn);
const obs: Observable<T> = of(items);
return obs;
}
function PartialReactComponent() {
const myItems: Observable<Items> = useSelectorAsStream<Items>(store => store.items);
}

我相信这应该适合你:

import { Observable, of } from 'rxjs';
import { useDispatch, useSelector } from 'react-redux';
type Items = string[];
interface AppStore {
items: Items
}
type SelectFn<T> = (state: AppStore) => T
function useSelectorAsStream<T>(selectFn: SelectFn<T>) {
const items = useSelector<AppStore, T>(selectFn);
const obs: Observable<T> = of(items);
return obs;
}
function PartialReactComponent() {
const myItems = useSelectorAsStream<Items>(store => store.items);
}

游乐场

带安全类型:

import { Observable, of } from 'rxjs';
import { useDispatch, useSelector } from 'react-redux';
type Items = string[];
interface AppStore {
items: Items
}
type SelectFn<T> = (state: AppStore) => T
type Result<T> =
typeof useSelector extends <State, Selected>(cb: SelectFn<T>) => T
? SelectFn<T>
: never

function useSelectorAsStream<T>(selectFn: Result<T>) {
const items = useSelector<AppStore, T>(selectFn);
const obs: Observable<T> = of(items);
return obs;
}
function PartialReactComponent() {
const myItems: Observable<Items> = useSelectorAsStream<Items>(store => store.items);
}

最新更新