可覆盖的参数类型

时间:2019-08-30 11:46:07

标签: typescript generics

我有一个通用类import matplotlib.pyplot as plt # plotting the points n = [1,50, 250, 1000, 5210] m = [1,2,3,4,5] plt.plot(n, m) # naming the x axis plt.xlabel('X') # naming the y axis plt.ylabel('Y') # giving a title to my graph plt.title('test') plt.xticks(n) plt.show() ,其中包含方法C<T>,期望参数为f

T

我想增加覆盖此参数类型的功能:

let c = new C<string>();

c.f('a');  // should work
c.f(1);    // shouldn't work

问题是我无法弄清楚此函数签名的外观。

我尝试了这两种解决方案:

c.f<number>(1)  // should work

但在两种情况下ts都允许class C<T> { f<O = T>(arg: O) {} } class C<T> { f<O>(arg: O extends undefined ? T : O) {} } ,我不想这么做。

TypeScript playground

2 个答案:

答案 0 :(得分:1)

Typescript将基于参数推断类型参数。有一个建议使非推论参数,但这已经有一段时间没有动了,但是我们可以使用该主题的GH issue中建议的解决方法。这种NoInfer类型会使编译器感到困惑,以至于放弃了从特定参数进行推断的过程。

如果typescript无法推断类型参数,它将回退默认类型,约束或unknown。我们可以使用默认类型来指定一个可能对该参数无效的值(我们也可以使用never,但是字符串消息通常会更有用)

type NoInfer<T> = [T][T extends any ? 0 : never];
class C<T> {
  f(arg: T): void
  f<O = "No explict type parameter was provided">(arg: NoInfer<O>) : void
  f(arg: unknown) {} 
}

let c = new C<string>();

c.f('a');       // works
c.f(1);         // does not work
c.f<number>(1)  // works

play

答案 1 :(得分:0)

您可以这样使用它

<script src="https://code.jquery.com/jquery-1.11.2.min.js" type="text/javascript"></script>


<div id="content">
    <h3>Example One</h3>
    <h3>Example Two</h3>
    <h3>Example Three</h3>
</div>

<div id="sidemenu-container">
    <div class="wpb_wrapper">
        <div class="wpb_wrapper">
        </div>
    </div>
</div>