🦁️最容易被忽略的上下文类型

🐯最容易被忽略的上下文类型

在我们日常和别人对话的过程中,我们回答别人的时候会在语境中去回答,其实这个语境就是所谓的上下文,其实上下文这个概念最近挺火的,因为随着gpt的出现,它的多轮对话功能其实就是基于上下文(结合你的前几句话进行回答)。

其实在TS中也有这种情况,下方的代码会根据上方代码的定义进行推导出相应的类型,最常见的有一下情况

🦴一.函数签名中

type Cunstormer = (name:string,age:number)=>boolean
const demo:Cunstormer=(a,b)=>true

🦁️最容易被忽略的上下文类型

从类型推断的图片中我们可以清晰的看到a这个参数的类型被推导成了string类型,而b会被推导成number类型,需要注意的一点是在上下文类型中,我们实现的表达式可以只使用更少的参数,而不能使用更多,这还是因为上下文类型基于位置的匹配,一旦参数个数超过定义的数量,那就没法进行匹配了。

  • 嵌套中的函数也能在上下文类型中推导出来
declare let func: (raw: number) => (input: string) => any;

// raw → number
func = (raw) => {
  // input → string
  return (input) => {};
};
  • 在某些情况下上下文类型也会失效,目前TypeScript中还不支持联合类型的这种推导的判断方式~
class Foo {
  foo!: number;
}

class Bar extends Foo {
  bar!: number;
}

let f1: { (input: Foo): void } | { (input: Bar): void };
// 参数“input”隐式具有“any”类型。
f1 = (input) => {};

🐶二.void类型的特殊情况

我们知道上下文类型会推导出相应位置的类型,包括返回值的类型,但是我们来看下下边这个例子,当我们遇到返回值为Void的时候我们可以忽略,因为虽然你可以返回其他类型,但是其实推导出来的还是void,上下文类型对于 void 返回值类型的函数,并不会真的要求它啥都不能返回。然而,虽然这些函数实现可以返回任意类型的值,但对于调用结果的类型,仍然是 void

type CustomHandler = (name: string, age: number) => void;

const handler1: CustomHandler = (name, age) => true;
const handler2: CustomHandler = (name, age) => '777777';
const handler3: CustomHandler = (name, age) => null;
const handler4: CustomHandler = (name, age) => undefined;

const result1 = handler1('77777', 599); // void
const result2 = handler2('77777', 599); // void
const result3 = handler3('77777', 599); // void
const result4 = handler4('77777', 599); // void

🐦三.总结

其实上下文类型就是TS中的一种“隐士”默默的在背后起作用,其实你可以完全不知道或者不理会它,但是它依旧在~

原文链接:https://juejin.cn/post/7239254291457572901 作者:举个栗子儿

(0)
上一篇 2023年6月1日 上午10:31
下一篇 2023年6月1日 上午10:42

相关推荐

发表回复

登录后才能评论