在打字稿3.5中,Omit
helper is added。
假设第三方API提供以下接口和功能:
interface Params {
n: number;
s: string;
b: boolean;
on: number;
os: string;
ob: boolean;
}
function api(params: Params) {...}
我想为api
写一个包装器,这样我只需要向其余代码库公开有趣的属性即可。
function wrapper(params: Omit<Params, 'on' | 'os' | 'ob'>) {
(params as Params).on = 1;
(params as Params).os = 'foo';
(params as Params).ob = false;
api(params as Params);
}
由于使用as
,对我来说这似乎是一种黑客。做到这一点的最优雅的方法是什么
params.on = 'bar';
)分配了错误的类型,则类型检查可以捕获。on
),类型检查可以捕获。在当前实现中不会捕获此类型。答案 0 :(得分:0)
您可以想到两种选择:
// Option 1: Object spread
type WrapperParms = Omit<Params, 'on' | 'os' | 'ob'>;
function wrapper(params: WrapperParms) {
return api({
on: 1,
os: 'foo',
ob: false,
...params
});
}
// Option 2: Optionals + default values + Object spread
type FilteredParams = 'on' | 'os' | 'ob';
type OptionalParams = Partial<Pick<Params, FilteredParams>>;
type WrapperParams2 = Omit<Params, FilteredParams> & OptionalParams;
function wrapper2(params: WrapperParams2) {
// assign default values to optional parameters
const {on = 1, os = 'foo', ob = false, ...rest} = params;
return api({
on,
os,
ob,
...rest
});
}
使用第二个选项,类型定义可能看起来更复杂,但它们为包装函数的用户提供了更大的灵活性。这样可以将省略的属性有效地转换为可选属性,因此它们可以提供包装参数的替代值。