TypeScript中`:后面的东西`叫做什么专业术语呢?

我们知道可以按照如下的方式定义泛型函数,并使用:

function swap<T>(a: T, b: T): void {
  const temp = a;
  a = b;
  b = temp;
  console.log(`a: ${a}, b: ${b}`);
}

// 调用泛型函数
swap<number>(1, 2); // 输出: "a: 2, b: 1"
swap<string>('hello', 'world'); // 输出: "a: world, b: hello"

但是我想要定义一个新的函数(以swap函数为类型)如何做呢?

我尝试下面的方式:

const testFun: swap<string> = (a: string, b: string) => {
  
}

但是会报错:
image.png


1、是否也就是说,不能以泛型函数为:后面的东西对吗?
2、:后面的东西叫做什么专业术语呢?
肯定不能说是类型(type),因为interface也可放在:后面。

阅读 2k
3 个回答
  1. swap 又不是个类型,typeof swap 才是类型。

    const testFun: typeof swap<string> = (a, b) => { 
      // 参数的类型已经不需要显式声明了,会自动推断成 string 的
      // 当然你要愿意非得声明出来那也行
    }
  2. 就叫“类型”,严格来说出现在函数参数里,叫“显式类型声明”( Explicit Types Declaration );出现在 var/let/const 变量里,叫“变量类型注解”( Type Annotations on Variables )。但总而言之就是 Type 。你说的那个 type 那只是一个关键字而已,并不影响这个玩意儿叫啥 —— 人家名字就叫 "TypeScript",那你打算咋理解开头的 "Type"?况且 type 关键字定义出来的东西严格来说也应该叫“类型别名”( Type Alias )。

P.S. 从过往的提问来看感觉题主是在看某些 TS 项目的源码、但自己却没有系统地学习过 TS,所以东一榔头西一棒子的遇到啥问题了就跑过来问啥,我个人建议你先找个入门教程先自学一下,而且不要去纠结这些名词概念,这对入门没有帮助。等你学会了基本的语法之后,再去看这些概念性的东西,相互印证。

1.你不能直接泛型函数作为类型注解,你要新建一个类型别名来

type SwapFunction<T> = (a: T, b: T) => void;

const testFun: SwapFunction<string> = (a, b) => {
  // ...
};

2.类型注解(Type Annotation)
可以看看这篇文章;使用TypeScript类型注解,编写更干净的JS代码

: 后面的东西叫类型,<T> 里面的东西 T 叫泛型参数,可以当作类型来使用。

你想要的 Swap 类型可以这么声明:

type Swap<T> = (a: T, b: T) => void;

或者

interface Swap<T> {
  (a: T, b: T): void;
}

那么,可以这么用

const testFunc: Swap<string> = (a: string, b: string) => { };
推荐问题
logo
Microsoft
子站问答
访问
宣传栏