首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >推断类型“%1”而不是number

问推断类型“%1”而不是number
EN

Stack Overflow用户
提问于 2020-09-29 03:22:11
回答 2查看 86关注 0票数 5

我有这个打字代码

代码语言:javascript
复制
type X = (<T extends number | string>(a: T) => (b: T) => T)

const f: X = (a: any) => (b: any) => a + b

f(1)(2)

它显示错误

代码语言:javascript
复制
Argument of type '2' is not assignable to parameter of type '1'.

第一个参数中推断的类型是'1',但我希望它是number,并对泛型string | number具有相同的约束。

传递的参数类型只能是number或string,即约束为string | number。

Playground

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-29 03:35:39

这对你的情况有效吗?

代码语言:javascript
复制
type XGen<T extends string | number> = (a: T) => (b: T) => T;
type X = XGen<string> & XGen<number>;
const f: X = (a: any) => (b: any) => a + b;

f(1)(2);
f(1)('2'); // error
f('1')('2');
f([])([]); // error

这样做的目的是让TypeScript只在string和number之间进行选择(而不是猜测任何其他扩展它们联合的类型(比如示例中的1 ))。我们通过创建一个基本的通用帮助器类型XGen和创建一个XGen<string>和XGen<number>的交集类型(因此强制typescript只能在这两者之间进行选择)来实现这一点。

票数 3
EN

Stack Overflow用户

发布于 2020-09-29 03:39:48

为什么不仅仅是<T=number|string>,为什么是<T extends number | string>

我刚试过

代码语言:javascript
复制
type X = (<T = number | string>(a: T) => (b: T) => T)

const f: X = (a: any) => (b: any) => a + b

console.log( f(1)(2) );
console.log( f("1")("2") );

结果:

代码语言:javascript
复制
[LOG]: 3 
[LOG]: "12" 

在你给我们的同一个游乐场里,它工作得很好。

我上次编写TS代码已经有一段时间了,但我认为当您使用extends约束时,您意味着T将是某种派生类型,而唯一与f(1)匹配的可用类型是某种“文字类型”。我的意思是,1从number“升级”到文字类型"1“(与文字字符串类型等相同的机制,只是使用数字文字而不是字符串文字)..

我敢打赌,你的意思不是X类型是数字的后代,也不是字符串的后代。我觉得这有点..。罕见的..。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64108351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档