默认泛型可作为参数正常使用,但不能作为函数参数的返回类型使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了默认泛型可作为参数正常使用,但不能作为函数参数的返回类型使用相关的知识,希望对你有一定的参考价值。

我已经设法对类型A的泛型使用默认值,并且在将其用作对象参数(函数c)时可以很好地工作,但是,如果我尝试将其用作传入的函数参数(函数d)Object literal may only specify known properties, and 'ping' does not exist in type 'B'.

没有正确错误
type A =  foo: string 
type B =  bar: string 

function c<T = A, InferredType extends T = T>(config: InferredType): void  
function d<T = A, InferredType extends T = T>(config: () => InferredType): void  

c( foo: 'foo' );
c( bar: 'bar' ); // Correctly errors
c<A>( bar: 'bar' ); // Correctly errors
c<B>( bar: 'bar' );
c<B>( bar: 'bar', ping: 'ping' ); // Correctly errors

d(() => ( foo: 'foo' ));
d(() => ( bar: 'bar' )); // Correctly errors
d<A>(() => ( bar: 'bar' )); // Correctly errors
d<B>(() => ( bar: 'bar' ));
d<B>(() => ( bar: 'bar', ping: 'ping' )); // Should error with unknown property but doesn't
d<B>((): B => ( bar: 'bar', ping: 'ping' )); // Errors correctly but requires duplicate type

Playground Link

如果您第二遍指定类型(B),如您在最后一行看到的那样,它会按预期工作,但是这违背了首先使用泛型的目的。

这是打字稿本身的问题,还是我在这里遗漏了什么?

答案

我一直在调查您的问题,据我所知,它应该像那样工作。

以上是关于默认泛型可作为参数正常使用,但不能作为函数参数的返回类型使用的主要内容,如果未能解决你的问题,请参考以下文章

Java 泛型与 C++ 模板有何不同?为啥我不能使用 int 作为参数?

泛型谓词的默认值作为参数

在函数c ++中将变量作为默认参数传递[重复]

使用泛型类型参数作为参数

Kotlin泛型 ① ( 泛型类 | 泛型参数 | 泛型函数 | 多泛型参数 | 泛型类型约束 )

泛型成员函数指针作为模板参数