I don't know how to describe this question right, so please see the belows code
interface TestParams<T> {
order?: keyof T
attr1?: number
attr2?: string
}
async function Test<T = any>(_obj: TestParams<T>): Promise<T> {
return {} as T
}
Test({ order: 'id2' })
// function Test<{
// id2: any;
// }>(_obj: TestParams<{
// id2: any;
// }>): Promise<{
// id2: any;
// }>
Why the T
type is { id2: any; }
instead of any
The belows is my needs type
function Test<any>(_obj: TestParams<any>): Promise<PostgrestResponse<any>>
Update
Update
I added U
which is keyof T
, then implement my needs
interface TestParams<T> {
order?: T
attr1?: number
attr2?: string
}
async function test<T = any, U = keyof T>(_obj: TestParams<T extends undefined ? string : U>): Promise<T> {
return {} as T
}
test({ order: 'id2' })
// The belows type is what I needed
// function test<any>(_obj: TestParams<"id2">): Promise<any>
interface TestType {
id2: number
id3: number
}
test<TestType>({ order: 'id2' })
CodePudding user response:
If { order: 'id2' }
is a TestParams<T>
then, because order
is keyof T
, your T
must be an interface that has a id2
property. There is no restriction on the property's type, so it has to be any
.
Thus, T
is an interface with an id2
property of any value. That's why T
is { id2: any; }
.
CodePudding user response:
You're missing a generic constraint on U
so TypeScript can't infer what string you gave to TestParams
:
async function test<T = any, U extends keyof T = keyof T>(_obj: TestParams<U>): Promise<T> {
// ^^^^^^^^^^^^^^^
return {} as T
}