比如:
interface AudioEngineRemoteOpts {
url: string;
……
}
interface AudioEngineOpts {
loop?: boolean;
……
}
playBGM_COCOS(opts: AudioEngineOpts | AudioEngineRemoteOpts) {
if(opts是AudioEngineOpts ) ……
else if(opts是AudioEngineRemoteOpts)……
}
我尝试过用‘url’ in opts来判断,但是这样可能会访问到原型链,用opts.url === undefined也会被ts提醒说可能没有url属性。或者用断言来回避这个问题,但是我想知道有没有更好的代码组织方式,让这个问题不发生,而不是回避它
看一下这个官方建议的解决方案:
使用类型谓词
可以增加一个 type
字段:
interface AudioEngineRemoteOpts {
type: 'engine-remote'
}
interface AudioEngineOpts {
type: 'engine'
}
if(opts.type === 'engine') {
/** code */
}
我觉得直接用 'url' in opts
就可以了。
在TypeScript中,当你有一个函数接收多种类型的参数时,并且需要根据参数的类型来执行不同的逻辑,你可以使用几种不同的策略来优雅地处理这种情况。以下是一些建议:
类型守卫 (Type Guards):
类型守卫是一种表达式,它在运行时评估,并且返回一个布尔值,该值可以用于缩小类型检查器的类型范围。
function isAudioEngineOpts(opts: any): opts is AudioEngineOpts {
return !(opts as AudioEngineOpts).url; // 假设AudioEngineOpts没有url属性
}
function isAudioEngineRemoteOpts(opts: any): opts is AudioEngineRemoteOpts {
return (opts as AudioEngineRemoteOpts).url !== undefined;
}
function playBGM_COCOS(opts: AudioEngineOpts | AudioEngineRemoteOpts) {
if (isAudioEngineOpts(opts)) {
// opts 现在是 AudioEngineOpts
} else if (isAudioEngineRemoteOpts(opts)) {
// opts 现在是 AudioEngineRemoteOpts
}
}
注意,在这个例子中,我们假设AudioEngineOpts
不包含url
属性,所以可以使用!(opts as AudioEngineOpts).url
来判断。如果AudioEngineOpts
有其他独特的属性或方法可以用来区分,你应该使用那些。
类型断言 (Type Assertions):
如果你确信你知道参数的类型,并且想要告诉TypeScript忽略类型检查,你可以使用类型断言。但是,类型断言应该谨慎使用,因为它们会绕过TypeScript的类型系统。
function playBGM_COCOS(opts: AudioEngineOpts | AudioEngineRemoteOpts) {
if ('url' in opts) {
// 使用类型断言,但确保你确实知道这是安全的
const remoteOpts = opts as AudioEngineRemoteOpts;
// ...
} else {
// 假设这里除了AudioEngineRemoteOpts就是AudioEngineOpts
const engineOpts = opts as AudioEngineOpts;
// ...
}
}
注意,这里使用'url' in opts
作为类型检查的基础,但是仍然使用了类型断言。
undefined
或null
的属性时,它们是很有用的工具。选择哪种方法取决于你的具体需求和偏好。在大多数情况下,类型守卫和类型断言是处理这种情况的有效方法。但是,如果可能的话,最好避免在函数体内部进行复杂的类型检查,并尽量通过设计来减少这种需要。
接口传参的时候需要给后端传的参数是数组 大概是这样的: 在这弹窗里面,点击弹窗下面的保存按钮调接口,需要把每一行的单位代码和总人口作为参数传过去,还要判断一下id,这条数据有id的话就传id,没有id的话就不传id 只传单位代码和总人口 请问接口传参应该怎么传多维数组,把每一行的单位代码和总人口传给后端,还有判断id应该怎么去操作呢?
以Cesium.ScreenSpaceEventType.LEFT_CLICK和Cesium.ScreenSpaceEventType.MOUSE_MOVE为例,当setInputAction方法的第二个参数为Cesium.ScreenSpaceEventType.LEFT_CLICK时该方法的回调函数的click参数的类型为Cesium.ScreenSpaceEventHandler.Posit
这是接口接受的类型: 这是我目前的: 因为接口接收一个JSON数组,类型1 的 value 需要变成 [''],其他类型就不用变。 这是我目前的写法
BTW在pgadmin中运行完美。 更新:我将其更改为java.sql.timestamp,但仍然不起作用:
问题内容: 我正在为核心数据编写通用包装类。 这是我的一些基本类型。没什么特别的。 我已经将我的coredata写在协议中抽象化了。如果您让我知道您对我要提出的抽象的意见,我将不胜感激。但是在扩展中,我遇到了以下错误: 无法将类型“ NSFetchRequest”的值转换为预期的参数类型“ NSFetchRequest <_>” 不确定我该如何解决。我尝试了各种更改代码的尝试,但未成功…… 另外,
问题内容: 我有以下课程(来自简单的Spring教程) 其中Validator类是Spring 2.5中的类。 如果我尝试向其中添加参数,则supports方法显示警告(Class是原始类型。对泛型类型Class的引用应进行参数化) 我收到以下错误: 关于这种类型的问题有很多线索,但是我想获得一个完整的答案并真正理解它,而不会用“隐藏”这个问题! 问题答案: 接口使用原始类型声明该方法。在这种情况
我有一个带参数的函数。此参数必须是两种接口之一。所以我这样写: 但我收到了以下错误。 以下是接口: 因特拉加: 内溶: 我不知道有什么问题。假设函数的参数可以有两种不同的结构。我不知道为什么Tslink会标记它。 提前感谢您的帮助。
这里的 create 方法参数的类型理想状态下应该是 ParamsA | ParamsB,这里为什么会是 ParamsA & ParamsB 在线查看代码