在打字稿中以不同的方式声明函数类型?

时间:2020-03-17 09:06:06

标签: typescript types

我在打字稿中发现,您可以简单地使用declare关键字声明函数类型,例如:

declare function test1(name: string): true

const t1 = test1('t') // true

我也可以使用箭头符号来做到这一点:

const test2 = (name: string) => true

const t2 = test2('t') // boolean

它们两者都工作正常,没有任何编译器错误。但是,即使我将它们同时指定为true,似乎最终的推断类型也不相同吗?

同时,如果我将返回类型true更改为常规基本类型,例如string,第二个示例将给我一个错误:

declare function test1(name: string): string // ok

const test2 = (name: string) => string // error: 'string' only refers to a type, but is being used as a value here.

对于“箭头函数表示法”类型,您必须将返回结果/类型指定为特定结果,例如,如果将其放入最终结果中,泛型也没有意义:< / p>

declare function test1<T>(name: T): T // ok

const test2 = <T>(name: T) => T // error: 'T' only refers to a type, but is being used as a value here.

但是,它们都不都是“看起来像类型” ,我的意思是,您可以使用const关键字来定义它们(在第二个示例中,通常是(根据我的知识声明变量),然后您可以像普通函数一样调用它们,它将为您提供返回类型/结果,而无需实现实际的详细信息:

test1('xxx')
test2('xxx')

所以我的问题是:

  • 它们是真的类型(例如类型别名)吗?他们在打字稿中有真实姓名吗?
  • 这两种表示法之间有区别吗?我们如何正确使用它们?

1 个答案:

答案 0 :(得分:1)

当您declare进行操作时,它只是告诉TypeScript编译器在运行时将存在该函数/变量/类等,并在编译期间将其删除。您指定该事物的 type (或函数的函数签名):

// these are the same
declare function test1(name: string): true
declare const test1: (name: string) => true
test1('') // true

您使用test2所做的是创建了一个箭头函数,该函数将在运行时存在,因为您没有使用declare关键字并提供了实现:

// these are also the same
function test2(name: string) {
  return true
}
const test2 = (name: string) => true
test2('') // boolean

由于未明确声明返回类型,因此TypeScript推断返回类型为boolean。要指定它为true

function test3(name: string): true {
  return true
}
const test3 = (name: string): true => true
test3('') // true