【发布时间】:2017-08-01 15:00:34
【问题描述】:
我想在高阶函数的内部函数中使用泛型类型作为参数。但是,当我这样做时,外部函数上的参数会丢失它们的类型(变为any)。
这是我正在尝试做的一个示例。我预计第 2 行会出错。
type TestFunc = <T>(outerArg: string) => (innerArg: T) => number
const test: TestFunc = <T>(outerArg) => (innerArg: T) => innerArg ? outerArg * 3 : 0 // no error because `outerArg` is `any` (unexpected)
当innerArg 不是通用的时,我会收到预期的错误:
type TestFunc = (outerArg: string) => (innerArg: boolean) => number
const test: TestFunc = (outerArg) => (innerArg: boolean) => innerArg ? outerArg * 3 : 0 // error because `outerArg` is `string` (expected)
问题
在第一个示例的第 2 行,outerArg 的类型为 any。在第二个示例的第 2 行,outerArg 的类型为 string。为什么它们不同?
更多详情
我的目标是在评估外部函数时允许指定T。例如:
type TestFunc = <T>(outerArg: string) => (innerArg: T) => number
const test: TestFunc = (outerArg) => (innerArg) => innerArg ? outerArg.length * 3 : 0
const test2: TestFunc = <T>(outerArg) => (innerArg: T) => innerArg ? outerArg * 3 : 0 // want error
const fourBool = test<boolean>('str')
console.log(fourBool(true))
console.log(fourBool(1)) // want error
const fourNum = test<number>('str')
console.log(fourNum(true)) // want error
console.log(fourNum(1))
【问题讨论】:
-
您的 outerArg 在顶部有类型字符串,在底部有数字。可能有点混乱。
-
谢谢。我将进行编辑以使它们保持一致。
标签: typescript