TypeScript:在将参数传递给函数调用之前检查是否定义了所需的参数属性
TypeScript: check that the required properties of an argument are defined before passing it to a function call
这无法编译 (playground):
function myFunction(params: {
a: Date,
b?: Date
}) {
if (params.b) {
myFunctionInternal(params); // ERROR!
}
}
function myFunctionInternal(params: {
a: Date,
b: Date
}) {}
是否有比 params as any
更优雅的解决方法?
错误消息说 属性 'b' 在类型中是可选的 '{ a: Date; b?: 日期; }' 但在类型 '{ a: Date; 中需要b:日期; }'
可以这样解决
myFunctionInternal(params as {a,b});
或
myFunctionInternal({a:params.a ,b:params.b});
问题是类型保护只影响字段的类型(params.b
将删除 undefined
)而不是整个对象的类型(param
将继续具有类型 { a: Date, b?: Date }
)
不确定我会称之为更优雅,但我们可以创建一个类型保护,从类型字段中删除未定义:
type RemoveOptionalFromField<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>> & { [P in K]-?: T[P] }
function notNull<T, K extends keyof T>(o: T | RemoveOptionalFromField<T, K>, key: K) : o is RemoveOptionalFromField<T, K> {
return !!o[key];
}
function myFunction(params: {
a: Date,
b?: Date
}) {
if (notNull(params, 'b')) {
params.b.getDate()
myFunctionInternal(params);
}
}
我们甚至可以创建一个采用任意数量密钥的版本:
function allNotNull<T, K extends keyof T>(o: T | RemoveOptionalFromField<T, K>, ...keys: K[]) : o is RemoveOptionalFromField<T, K> {
return keys.every(k => !!o[k]);
}
function myFunction(params: {
a?: Date,
b?: Date
}) {
if (allNotNull(params, 'b', 'a')) {
params.b.getDate()
myFunctionInternal(params);
}
}
这无法编译 (playground):
function myFunction(params: {
a: Date,
b?: Date
}) {
if (params.b) {
myFunctionInternal(params); // ERROR!
}
}
function myFunctionInternal(params: {
a: Date,
b: Date
}) {}
是否有比 params as any
更优雅的解决方法?
错误消息说 属性 'b' 在类型中是可选的 '{ a: Date; b?: 日期; }' 但在类型 '{ a: Date; 中需要b:日期; }'
可以这样解决
myFunctionInternal(params as {a,b});
或
myFunctionInternal({a:params.a ,b:params.b});
问题是类型保护只影响字段的类型(params.b
将删除 undefined
)而不是整个对象的类型(param
将继续具有类型 { a: Date, b?: Date }
)
不确定我会称之为更优雅,但我们可以创建一个类型保护,从类型字段中删除未定义:
type RemoveOptionalFromField<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>> & { [P in K]-?: T[P] }
function notNull<T, K extends keyof T>(o: T | RemoveOptionalFromField<T, K>, key: K) : o is RemoveOptionalFromField<T, K> {
return !!o[key];
}
function myFunction(params: {
a: Date,
b?: Date
}) {
if (notNull(params, 'b')) {
params.b.getDate()
myFunctionInternal(params);
}
}
我们甚至可以创建一个采用任意数量密钥的版本:
function allNotNull<T, K extends keyof T>(o: T | RemoveOptionalFromField<T, K>, ...keys: K[]) : o is RemoveOptionalFromField<T, K> {
return keys.every(k => !!o[k]);
}
function myFunction(params: {
a?: Date,
b?: Date
}) {
if (allNotNull(params, 'b', 'a')) {
params.b.getDate()
myFunctionInternal(params);
}
}