条件类型ReturnType函数签名重载决策

时间:2018-03-07 17:44:33

标签: typescript conditional-types typescript2.8

我正在尝试使用typescript 2.8的新conditional types,(尚未发布的版本2.8.0-dev.20180307),我不知道这是一个错误还是仅仅是误用。我的重点是我的MockedImplementation<F>声明,它可以是匹配F的完整函数,F的返回类型,以及F的返回类型是{{} 1}},然后它也可能是承诺解决的 - 所有要由Promise相应地包装。

mockIt()
type MockedImplementation<F> = F | // The function signature ((ReturnType<F extends (...args: any[]) => any ? F : any>) extends infer T ? T extends Promise<infer R> ? (T | R) // Or the promise or just the type that the promise resolves to : T // or whatever type this is : never); interface Wrapped<T> { result: T } function mockIt<F>(pretend : MockedImplementation<F>) : F { throw new Error('Not Implemented'); // doesn't matter } interface SomeOperationA { (parameters : { 'a': number[], 'b'?: string }) : Promise<string>; } mockIt<SomeOperationA>(() => Promise.resolve('hello')); // OK mockIt<SomeOperationA>(Promise.resolve('hello')); // OK mockIt<SomeOperationA>('hello'); // OK mockIt<SomeOperationA>(42); // Type error. 的{​​p> mockIt可能正常工作,可能是因为没有函数签名覆盖。但SomeOperationA的{​​{1}}失败了:

mockIt

它似乎是交叉类型而不是联合它们?但我确信它比那更微妙。

我在某个地方看到了一个关于“考虑最后一次超载的说明,因为它可能是最普遍的”,但我不认为它在这里是相关的,因为它看起来似乎没那么重要。

修改

@jcalz是对的,有道理:

SomeOperationB

1 个答案:

答案 0 :(得分:3)

没有条件类型的问题的较小复制:

select new {

很明显,TypeScript不认为箭头函数与}兼容,因为它无法满足其中一个重载签名。实际上,如果您将FULL OUTER JOIN作为第二个参数传递给该函数,则将返回if ( $the_service->have_posts() ) : $output .= ' <div class="single-sidebar-widget"> <div class="special-links">'; $output .= '<ul class="nav nav-tabs single-services-menu" role="tablist"> <li><a href="http://example.com/all-services/">All Services</a> </li> while ( $the_service->have_posts() ) : $the_service->the_post(); $count++; if ( 0 == $post->post_parent ) { $args1 = array( 'post_type' => 'services', 'post_status' => 'publish', 'post_parent' => get_the_ID(), 'order' => esc_attr($order) ); if($varPageID == get_the_ID()) $varClass = 'class=active'; else $varClass = ''; $output .= '<li role="presentation" '.esc_attr($varClass).'><a href="'.get_permalink().'">'.get_the_title().'</a> </li>'; } endwhile; $output .= ' </ul></div></div>'; else: $output .= esc_html( 'Sorry, there is no services under your selected page.', 'plumbing' ); endif; wp_reset_postdata(); echo $output; ?> ,这是declare function acceptSomeOperationB(x: SomeOperationB): void; acceptSomeOperationB(() => Promise.resolve('hello')); // ❌ Type 'string' is not assignable to type 'Wrapped<string>'. 的第二个签名所要求的。

一旦你决定如何解决它,它应该开始工作(或者你至少可以继续处理条件类型的问题。)

祝你好运。