gpt4 book ai didi

TypeScript:在将参数传递给函数调用之前检查是否定义了所需的参数属性

转载 作者:搜寻专家 更新时间:2023-10-30 21:17:17 25 4
gpt4 key购买 nike

这不编译(playground):

function myFunction(params: {
a: Date,
b?: Date
}) {
if (params.b) {
myFunctionInternal(params); // ERROR!
}
}

function myFunctionInternal(params: {
a: Date,
b: Date
}) {}

有没有比 params as any 更优雅的解决方法?

最佳答案

问题是类型保护只影响字段的类型(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);
}
}

我们甚至可以创建一个接受任意数量 key 的版本:

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);
}
}

关于TypeScript:在将参数传递给函数调用之前检查是否定义了所需的参数属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51521484/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com