gpt4 book ai didi

typescript 在函数体中引用泛型 T

转载 作者:行者123 更新时间:2023-12-05 04:46:03 25 4
gpt4 key购买 nike

如果我要将一个类型声明为一个单独的变量,例如:

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 接受一个类型参数只是因为 fooFoo 的一个实现> 类型,即使 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com