首页 > 解决方案 > 为什么 Typescript 在给出扩展类型的泛型时可以得到准确的值

问题描述

正常用法:

我只有字符串[]

function getResult<T>(...v: T[]) {
  return v
}

const str = getResult('str', 'str2') // const str: string[]

// or even
const str = getResult<string>('str' as const, 'str2') // const str: string[]

但是如果我让泛型扩展字符串,最终会得到:

// for stirng
function getResultByExtendsString<T extends string>(...v: T[]) {
  return v
}

const str2 = getResultByExtendsString('str', 'str2') // const str2: ("str" | "str2")[]

// for number
function getResultByExtendsNumber<T extends number>(...v: T[]) {
  return v
}

const num2 = getResultByExtendsNumber(123, 456) // const num2: (123 | 456)[]

甚至是混合类型

但是如果我删除 P、Q 的扩展,它不会得到值,而是它的类型

type Types = string | number

function getAllResults<P extends Types, Q extends Types>(p: P, v: Q): (P | Q)[] {
  return [p, v]
}

const res = getAllResults('str', 123) // const res: ("str" | 123)[]

那么这是怎么发生的呢?

谢谢。从ts背景看

标签: javascripttypescript

解决方案


这可以确定是因为编译器的“上下文类型”能力。即使在等式的一侧(即函数)只有类型,TypeScript 编译器也可以计算出类型。泛型类 | 功能 | 如果数据类型未知或“复杂”,则变量通常用作“复杂”类型。

资源:

https://www.typescriptlang.org/docs/handbook/typescript-in-5-minutes.html#types-by-inference

https://www.typescriptlang.org/docs/handbook/functions.html#inferring-the-types


推荐阅读