TypeScript:属性'propertyName'在类型 'T' 上不存在



目前我正在学习 TypeScript,我有一个问题:">属性'值'在类型'T'上不存在">

这是我的代码:

type ParseType = <T>(value: T, opts: any, useRounding: boolean) => number;
const parse: ParseType = function(value, opts: any, useRounding): number {
//...
if (isNumber || value instanceof currency) {
v = (isNumber ? value : value.value) * precision;
}
//...

我将非常感谢:)的帮助

UPD:我刚刚添加了新的接口interface Currency {value?: number;},让我的泛型类型扩展了它:type ParseType = <T extends Currency>(value: T, opts: any, useRounding: boolean) => number;,并按照评论中的建议编写了两个单独的条件。

我猜currency总是包含一个value道具?Typescript 无法推断这一点,因为您正在使用两个嵌套条件语句 - 理论上可以,但它不够聪明。在内部三元条件下,Typescript 不知道!isNumber也意味着instanceof currency- 此连接丢失。isNumber也会发生同样的情况 - 即使您通过检查value在某个时候是否为数字来获得此布尔值,如果您在条件中的其他地方使用它,则此类型推断属性也不会随之而来。对于要推断类型的 Typescript,检查必须在条件中进行。

试试这个(将嵌套条件展平为两个单独的条件(:

if (typeof value === 'number') {
v = value * precision;
} else if (value instanceof currency) {
v = value.value * precision;
}

一个精简的例子:

function abc<R>(v: R) {
if (typeof v === 'number') {
// Typescript knows v is a number
}
const isNumber = typeof v === 'number';
if (isNumber) {
// Typescript knows nothing about v
}
}

相关内容

最新更新