TypeScript Autocomplete on extends keyof generic

vatpfxk5  于 4个月前  发布在  TypeScript
关注(0)|答案(5)|浏览(49)

TypeScript版本:3.3.0-dev.20181122
搜索词:

  • autocomplete
  • autocomplete generic
  • generic extends
  • autocomplete keyof extends
  • autocomplete keyof generic

代码:

type Except<T, K extends keyof T> = Pick<T, { [P in keyof T]: P extends K ? never : P }[keyof T]>;

interface I1 {
    foo: string;
}
function F1<T extends I1>(): Except<T, ''> { // error is shown but autocomplete is not provided
    //code
    return null;
}

预期行为:
在扩展泛型时显示自动补全
实际行为:
即使错误正确显示,对于具有已知类型的右侧的 T extends 也不会显示自动补全。
Playground链接:
https://www.typescriptlang.org/play/index.html#src=type%20Except%3CT%2C%20K%20extends%20keyof%20T%3E%20%3D%20Pick%3CT%2C%20%7B%20%5BP%20in%20keyof%20T%5D%3A%20P%20extends%20K%20%3F%20never%20%3A%20P%20%7D%5Bkeyof%20T%5D%3E%3B%0A%0Ainterface%20I1%20%7B%0A%20%20%20%20foo%3A%20string%3B%0A%7D%0Afunction%20F1%3CT%20extends%20I1%3E()%3A%20Except%3CT%2C%20''%3E%20%7B%0A%20%20%20%20%2F%2Fcode%0A%20%20%20%20return%20null%3B%0A%7D
相关问题:
#16740 - 但这个问题与此不同,因为它是一个 keyof 问题

lokaqttq

lokaqttq1#

当我扩展泛型时,我感到非常困惑。请查看这个链接,以了解为什么这可能没有实现:https://stackoverflow.com/a/58417200/7731090 。尽管如此,我还是按照你的建议做了一个。

我能理解为什么它不会进行类型检查,因为泛型本身就是通用的。另一方面,它至少应该提供它知道的值。我认为这可以减少一些困惑,而且很好用,但是需要考虑哪些缺点?

nbewdwxp

nbewdwxp2#

我认为没有任何重大缺点;我认为甚至会有一些好的副作用。
从这个:

到这个:

也将限制Intellisense结果中的噪音。

mm9b1k5b

mm9b1k5b3#

I found another example (more simple).
playground

interface I1 {
    foo: number;
}

// Working
type Working = Pick<I1, 'foo'>;

// Not working
interface NotWorking extends Pick<I1, 'foo'> {}

jgzswidk

jgzswidk4#

这里有另一个似乎由相同根本问题引起的示例:
Typescript Playground

rjjhvcjd

rjjhvcjd5#

FWIW keyof 在通用函数情况下是不必要的。此示例也不提供类型感知的自动完成建议:

declare const example: <T extends 'foo'>() => unknown
example<''>()
//       ^

相关问题