比如:
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
的属性时,它们是很有用的工具。选择哪种方法取决于你的具体需求和偏好。在大多数情况下,类型守卫和类型断言是处理这种情况的有效方法。但是,如果可能的话,最好避免在函数体内部进行复杂的类型检查,并尽量通过设计来减少这种需要。
以Cesium.ScreenSpaceEventType.LEFT_CLICK和Cesium.ScreenSpaceEventType.MOUSE_MOVE为例,当setInputAction方法的第二个参数为Cesium.ScreenSpaceEventType.LEFT_CLICK时该方法的回调函数的click参数的类型为Cesium.ScreenSpaceEventHandler.Posit
接口传参的时候需要给后端传的参数是数组 大概是这样的: 在这弹窗里面,点击弹窗下面的保存按钮调接口,需要把每一行的单位代码和总人口作为参数传过去,还要判断一下id,这条数据有id的话就传id,没有id的话就不传id 只传单位代码和总人口 请问接口传参应该怎么传多维数组,把每一行的单位代码和总人口传给后端,还有判断id应该怎么去操作呢?
我在项目中定义了两个 interface , 接下有个函数是处理这两个类型的 我自己想到了用 js 的 is 关键词去判断某个属性是否存在来具体区分这两个 interface ,但是这样好像已经到了 js 的层面了。 问题:在 TS 层面有没有可以实现的方式呢?
BTW在pgadmin中运行完美。 更新:我将其更改为java.sql.timestamp,但仍然不起作用:
这是接口接受的类型: 这是我目前的: 因为接口接收一个JSON数组,类型1 的 value 需要变成 [''],其他类型就不用变。 这是我目前的写法
问题内容: 我正在为核心数据编写通用包装类。 这是我的一些基本类型。没什么特别的。 我已经将我的coredata写在协议中抽象化了。如果您让我知道您对我要提出的抽象的意见,我将不胜感激。但是在扩展中,我遇到了以下错误: 无法将类型“ NSFetchRequest”的值转换为预期的参数类型“ NSFetchRequest <_>” 不确定我该如何解决。我尝试了各种更改代码的尝试,但未成功…… 另外,