В приведенном ниже коде версия с одним общим аргументом выдает предупреждение с включенным правилом TS noImplicitAny
. Обе функции идентичны по логике, я хочу изменить формат аргумента во второй. Это возможно с Typescript?
Более узкий вопрос: как получить доступ к конкретному значению универсального аргумента в новом объявлении типа?
Здесь ссылка на игровую площадку TS. Чтобы увидеть ошибку noImplicitAny
должно быть включено в Options
.
interface Test {
loader: any;
propName: string;
}
// This one has TS warnings (one generic arg)
export function doesntWork<T extends Test>({ loader: Preview, propName }: T) {
type ReturnType = {
[K in T['propName']]: {
loading: boolean
}
};
return <T extends ReturnType>(props: T) => {
/*
* Warning here:
* "Element implicitly has an 'any' type because type 'ReturnType' has
* no index signature."
*/
if (props[propName] && props[propName].loading) {
return Preview;
}
return false;
};
}
// This one works without warnings (two separate generic args)
export function works<_, PropName extends string>(Preview: any, propName: PropName) {
type ReturnType = {
[K in PropName]: {
loading: boolean
}
};
return <T extends ReturnType>(props: T) => {
if (props[propName] && props[propName].loading) {
return Preview;
}
return false;
};
}