我有这样一种类型,其中我的
现在我需要以一种方式创建新对象,该对象取决于 AsyncState 参数 - 如果 T 不是 undefined,则添加 value 属性,否则不添加。 (这只是更复杂的逻辑的虚拟示例,但由于类型问题,这应该足够了)
这里是typescript playground。
value
属性是“可选的”(如果T
不是undefined
)。type AsyncState<T = undefined> = {
value?: T;
loading: boolean;
error: { reason: string } | null;
}
现在我需要以一种方式创建新对象,该对象取决于 AsyncState 参数 - 如果 T 不是 undefined,则添加 value 属性,否则不添加。 (这只是更复杂的逻辑的虚拟示例,但由于类型问题,这应该足够了)
function asyncGet<T>(initialState: AsyncState<T>) {
return typeof initialState.value !== 'undefined'
? (s: AsyncState<T>) => ({ ...initialState })
: (s: AsyncState) => ({ loading: initialState.loading, error: initialState.error });
}
const first: AsyncState<string> = {
loading: true,
error: null,
value: ""
}
const second: AsyncState<string> = {
loading: true,
error: null,
value: ""
}
const creator = asyncGet(first);
/*
Argument of type 'AsyncState<string>' is not assignable to parameter of type 'AsyncState<string> & AsyncState<undefined>'.
Type 'AsyncState<string>' is not assignable to type 'AsyncState<undefined>'.
Type 'string' is not assignable to type 'undefined'.
*/
creator(second);
这里是typescript playground。
type AsyncState<T> = {loading: boolean; error: {reason: string} | null; value?: T | null}
?两者的差异似乎很小,而且处理起来应该更容易。 - jcalzvalue
是可选的,例如{value?: T | null}
,那么你不需要value: null
,对吧?它会被省略掉。我可能会认为你需要使用相对笨重的条件类型,但我想在这里看到一个[mcve],并且有实际的用例。就目前而言,我不知道该如何继续(combineReducers()
是什么?这个问题没有标记为redux
,如果你需要redux专业知识,那么它可能应该是...如果它不是关于redux的话,就提供一些不依赖于它的示例用例)。祝好运! - jcalz