作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果我要将一个类型声明为一个单独的变量,例如:
type Foo = <T>(x: T) => T
然后用它来定义一个函数:
const foo:Foo = x => {
let a = /*...*/
/*...function execution...*/
return a
}
如何在函数体中引用泛型T
,比如声明变量a:T
?
最佳答案
您不能以任何方式引用此类型参数,因为它在类型声明中。它基本上是在说“你看,任何 Foo
类型的函数都是通用的,你可以将类型参数传递给这种类型的任何函数,它的返回类型和参数将取决于这个类型参数” .您在 Foo
中指定的类型参数 T
实际上并不存在,它只是向 Foo
的任何调用者发出信号它可以接受一个。
现在您在编写 Foo
类型函数的实际实现 时使用此参数。喜欢
type Foo = <T>(x: T) => T
const foo: Foo = <T>(x: T) => {
let a: T = x
return a
}
或者例如你可以用不同的方式命名
type Foo = <T>(x: T) => T
const foo: Foo = <U>(x: U) => {
let a: U = x
return a
}
Foo
类型不强制执行任何内容,它只是表示“此函数有 1 个类型参数”,函数可以随心所欲地调用和使用此参数。甚至可以完全忽略它
type Foo = <T>(x: T) => T
const foo: Foo = () => {
return 5 as any
}
同样,就函数的调用者而言,foo
接受一个类型参数只是因为 foo
是 Foo
的一个实现> 类型,即使 foo
实际上没有使用它。
或者你可以添加一个可选的额外类型参数和一个该类型的可选变量
type Foo = <T>(x: T) => T
const foo: Foo = <U, K = number>(x: U, y?: K) => {
if(y) console.log(y)
let a: U = x
return a
}
这仍然有效,因为调用 foo
的人可以查看类型定义并看到“好的,Foo
接受 1 个类型参数和 1 个普通参数”。如果他们现在提供 1 个类型参数和 1 个普通参数,它仍然可以工作,因为 foo
在这种情况下工作正常。
关于 typescript 在函数体中引用泛型 T,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68961663/
我是一名优秀的程序员,十分优秀!