javascript - 为什么 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背景看
解决方案
这可以确定是因为编译器的“上下文类型”能力。即使在等式的一侧(即函数)只有类型,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
推荐阅读
- hyperledger-sawtooth - 如何修改 Sawtooth 渔网网站并查看日志?
- javascript - 无法为新的空活动解析资源文件 - Android
- javascript - Nunjucks:从 for 循环中的数组中选择特定项目
- amazon-web-services - 通过 AWS 安全 Web 服务防止“点击劫持”又名“UI 补救攻击”
- java - 显示字符在字符串中出现的次数
- php - WordPress ajax 请求不断返回 0(包括 wp_die())
- node.js - 为什么`sudo npm uninstall htmlhint -g`没有从`node_modules`中删除`htmlhint`文件夹?不工作?
- python-3.x - 成对的相似代码会产生由“except”语句引起的不同结果
- c++ - 将函数指针传递给模板类
- scala - 我想用一组关键词过滤 Lines read form 文本文件