打字稿等泛型 "No overload matches this call"
Typescript equal generics "No overload matches this call"
所以,我正在构建一个 TypeScript 应用程序,但我遇到了泛型和重载问题。这是我的代码的 minimal example:
function isEqual(data: string, value: string): boolean;
function isEqual(data: number, value: number): boolean;
function isEqual(data: boolean, value: boolean): boolean;
function isEqual(data: unknown, value: unknown): boolean {
return data === value;
}
function compareVals<ValueType>(
option: ValueType,
value: ValueType,
) {
return isEqual(option, value);
^^^^^
// No overload matches this call.
// Overload 1 of 3, '(data: string, value: string): boolean', gave the following error.
// Argument of type 'ValueType' is not assignable to parameter of type 'string'.
// Overload 2 of 3, '(data: number, value: number): boolean', gave the following error.
// Argument of type 'ValueType' is not assignable to parameter of type 'number'.
// Overload 3 of 3, '(data: boolean, value: boolean): boolean', gave the following error.
// Argument of type 'ValueType' is not assignable to parameter of type 'boolean'.
}
const equal = compareVals<number>(1,1); // equal: boolean
const equal2 = compareVals<boolean>(true, false); // equal2: boolean
我不明白为什么TS不使用相同的类型。
我也试过了
...
function compareVals<ValueType extends string | number | boolean>(
...
尝试强制 ValueType
作为一种重载类型,但它得到了同样的错误。
我觉得我在这里缺少一些非常基本的东西。
ValueType 定义如下:ValueType extends string | number | boolean
当值到达 isEqual 时,Typescript 无法推断值的类型,因为其中任何一个都可能是您定义的三个值中的任何一个。因此,compareVals 的函数签名与您定义的任何 isEqual 签名都不匹配。
如果我理解你的意图,你可以使 isEqual 通用,并指定 isEqual 中的类型相同。
function isEqual<T>(data: T, value: T): boolean {
return data === value;
}
function compareVals<ValueType extends string | number | boolean>(
option: ValueType,
value: ValueType,
) {
return isEqual<ValueType>(option, value);
}
ValueType 被传递给 isEqual,所以它知道会发生什么。
compareVals<number>(1, 1); // types check out
compareVals<boolean>(true, 1); // complains about 1: Argument of type 'number' is not assignable to parameter of type 'boolean'
所以,我正在构建一个 TypeScript 应用程序,但我遇到了泛型和重载问题。这是我的代码的 minimal example:
function isEqual(data: string, value: string): boolean;
function isEqual(data: number, value: number): boolean;
function isEqual(data: boolean, value: boolean): boolean;
function isEqual(data: unknown, value: unknown): boolean {
return data === value;
}
function compareVals<ValueType>(
option: ValueType,
value: ValueType,
) {
return isEqual(option, value);
^^^^^
// No overload matches this call.
// Overload 1 of 3, '(data: string, value: string): boolean', gave the following error.
// Argument of type 'ValueType' is not assignable to parameter of type 'string'.
// Overload 2 of 3, '(data: number, value: number): boolean', gave the following error.
// Argument of type 'ValueType' is not assignable to parameter of type 'number'.
// Overload 3 of 3, '(data: boolean, value: boolean): boolean', gave the following error.
// Argument of type 'ValueType' is not assignable to parameter of type 'boolean'.
}
const equal = compareVals<number>(1,1); // equal: boolean
const equal2 = compareVals<boolean>(true, false); // equal2: boolean
我不明白为什么TS不使用相同的类型。 我也试过了
...
function compareVals<ValueType extends string | number | boolean>(
...
尝试强制 ValueType
作为一种重载类型,但它得到了同样的错误。
我觉得我在这里缺少一些非常基本的东西。
ValueType 定义如下:ValueType extends string | number | boolean
当值到达 isEqual 时,Typescript 无法推断值的类型,因为其中任何一个都可能是您定义的三个值中的任何一个。因此,compareVals 的函数签名与您定义的任何 isEqual 签名都不匹配。
如果我理解你的意图,你可以使 isEqual 通用,并指定 isEqual 中的类型相同。
function isEqual<T>(data: T, value: T): boolean {
return data === value;
}
function compareVals<ValueType extends string | number | boolean>(
option: ValueType,
value: ValueType,
) {
return isEqual<ValueType>(option, value);
}
ValueType 被传递给 isEqual,所以它知道会发生什么。
compareVals<number>(1, 1); // types check out
compareVals<boolean>(true, 1); // complains about 1: Argument of type 'number' is not assignable to parameter of type 'boolean'