uni-app中第三方SDK要求传入float,但是uts引入后变成了number类型,导致类型矛盾。

发布于 1周前 作者 wuwangju 来自 Uni-App

uni-app中第三方SDK要求传入float,但是uts引入后变成了number类型,导致类型矛盾。

问题:第三方SDK【要求传入float】,但是uts引入后变成了【number】,引发的错误: sdk定义:腾讯云sdk官方定义是:setBeautyLevel(float beautyLevel) uts错误:import引入后在uts里变成了:(method)TXBeautyManager.setBeautyLevel(param0: number)

以下2种写法,直接编译通不过,导致插件无法运行: 1:error: 类型不匹配: 推断类型是Number,但预期的是Float。

let level : number = 9;
bm.setBeautyLevel(level);

2:error: The integer literal does not conform to the expected type Float

let level2 : Float = 9;
bm.setBeautyLevel(level2);

下面写法【可以编译通过、也能运行】,但有明确【波浪线错误提示】:类型“Float”的参数不能赋给类型“number”的参数。 没办法,现在只能采用这个写法了

let level : number = 9;
bm.setBeautyLevel(level.toFloat());

请问:这是uts的bug吗? 或者,我应该怎么写这个代码,就既能通过编译,又不会出现错误警告?

开发环境 版本号 项目创建方式
uts

6 回复

let level : number = 9; bm.setBeautyLevel(level.toFloat());
文档地址: https://doc.dcloud.net.cn/uni-app-x/uts/data-type.html#kotlin


就如上面我说的,这个写法可以通过编译、也可以正常运行。 但有个红色的【波浪线错误提示】:类型“Float”的参数不能赋给类型“number”的参数。

这错误提示,会干扰日常的编码,总以他是真正的错误。有什么办法避免吗?或者官方会修复吗?

回复 xkeee: 先忽略ide提示 稍后会修复

回复 DCloud_Android_DQQ: 好的,明白了。

在uni-app中处理第三方SDK要求传入特定类型(如float)但JavaScript/TypeScript中数据类型(如number)导致的类型矛盾问题,可以通过类型断言或类型转换来确保传入正确的数据类型。虽然JavaScript本身并不区分整数和浮点数(都统一为number类型),但你可以通过一些技巧来满足SDK的要求。

以下是一个示例,展示了如何在uni-app中处理这种情况,假设你有一个第三方SDK函数sdkFunction,它要求一个float类型的参数:

// 假设这是你的SDK函数,要求传入float类型参数
function sdkFunction(floatValue) {
    // 这里是SDK的实现细节,假设它会检查参数类型
    if (typeof floatValue === 'number' && !Number.isInteger(floatValue)) {
        console.log('Received a float value:', floatValue);
        // SDK逻辑处理
    } else {
        console.error('Expected a float value, but received:', typeof floatValue, floatValue);
    }
}

// 在uni-app中,你可能会这样调用SDK函数
// 假设你有一个uts引入的值,它默认是number类型
let utsValue = 123.456; // 这是一个示例值,实际情况可能来自uts或其他数据源

// 由于JavaScript不区分整数和浮点数,都是number类型
// 你可以通过检查或转换来确保它是一个非整数的浮点数
if (Number.isInteger(utsValue)) {
    // 如果utsValue是整数,可以将其转换为浮点数(加上一个小数部分)
    utsValue = utsValue + 0.0000001; // 或者其他足够小但不会改变其实际值的小数
}

// 使用类型断言(TypeScript)或直接调用SDK函数(JavaScript)
// 在TypeScript中,你可以使用类型断言来告诉编译器这是float类型(尽管这只是编译时检查)
// let floatValue: number = utsValue as any as float; // 这种写法在TypeScript中并不实际,因为float不是有效类型

// 更实际的做法是直接调用,因为JavaScript/TypeScript运行时不会区分float和number
sdkFunction(utsValue);

// 如果你在使用TypeScript,并且想避免类型错误,可以定义一个更宽松的类型检查函数
function isFloat(value: number): boolean {
    return typeof value === 'number' && !Number.isInteger(value);
}

// 然后你可以使用这个检查函数来确保你的值符合要求
if (isFloat(utsValue)) {
    sdkFunction(utsValue);
} else {
    console.error('Value is not a float:', utsValue);
}

在这个例子中,我们通过检查Number.isInteger来确定一个值是否是整数,并在必要时通过加上一个非常小的数来将其转换为浮点数。然后,我们直接调用SDK函数,因为JavaScript在运行时不会区分floatnumber。如果你在使用TypeScript,可以通过类型检查和断言来确保类型安全,尽管这主要是编译时的帮助。

回到顶部