Typescript 错误与';绝不';将extends keyof用作泛型类型时的类型

Typescript 错误与';绝不';将extends keyof用作泛型类型时的类型,typescript,lenses,Typescript,Lenses,我的typescript代码: class Author { id: number; } type Getter<S, A> = (obj: S) => A; function propGetter<S, K extends keyof S>(prop: K): Getter<S, S[K]> { return o => o[prop]; } const _id: Getter<Author, number> = propGe

我的typescript代码:

class Author {
  id: number;
}
type Getter<S, A> = (obj: S) => A;

function propGetter<S, K extends keyof S>(prop: K): Getter<S, S[K]> {
  return o => o[prop];
}
const _id: Getter<Author, number> = propGetter('id');


据我所知,K型应该是S型键的字符串。它是如何统一到never的?这是因为使用映射类型作为泛型参数?

当您只传递
K
时,编译器无法推断
s
的类型
如果您这样做,它将起作用:

const _id: Getter<Author, number> = propGetter<Author, "id">('id');

编辑 再想一想,您可以这样做:

function propGetter<S>(prop: keyof S): Getter<S, S[typeof prop]> {
    return o => o[prop];
}
const _id = propGetter<Author>('id'); // type of _id is Getter<Author, number>
function-propGetter(prop:keyof-S):Getter{
返回o=>o[prop];
}
常量_id=propGetter('id');//_id的类型是Getter

第二版 我不喜欢在编译的js中添加无用的代码,只是为了让编译器满意。
在这种情况下,我认为最好的解决方案是:

function propGetter<S>(prop: keyof S): Getter<S, any> {
    return o => o[prop];
}

const _id = propGetter<Author>('id') as Getter<Author, number>;
// or
const _id: Getter<Author, number> = propGetter<Author>('id');
function-propGetter(prop:keyof-S):Getter{
返回o=>o[prop];
}
const_id=作为吸气剂的支撑剂(“id”);
//或
常量id:Getter=propGetter('id');

通过这种方式,您可以以一种不太冗长的方式获得类型安全性,并且没有任何添加到js中的内容不属于js。

是有意义的!遗憾的是,我不能将对象作为参数添加到函数中。如果我能写一个道具('id')你的编辑行得通,那就太好了,因为作者只有一个道具。例如,如果您添加第二个prop name类型字符串,_id将使用type
Getter
I注入类构造函数作为参数,并且typescript能够推断类型。也不完美<代码>函数propGetter(ctor:new(…args:any[])=>S,prop:K):Getter{return o=>o[prop];}因此我可以调用
propGetter(Author,'id')
function propGetter<S>(prop: keyof S): Getter<S, S[typeof prop]> {
    return o => o[prop];
}
const _id = propGetter<Author>('id'); // type of _id is Getter<Author, number>
function propGetter<S>(prop: keyof S): Getter<S, any> {
    return o => o[prop];
}

const _id = propGetter<Author>('id') as Getter<Author, number>;
// or
const _id: Getter<Author, number> = propGetter<Author>('id');