type ArrayBufferViewConstructor<T> = new (buffer: ArrayBufferLike, byteOffset?: number, byteLength?: number) => T;
function asView<V, C extends ArrayBufferViewConstructor<V>>(
TypedArray: C,
v: BufferSource,
byteOffset?: number,
byteLength?: number,
): V{
return undefined as V
}
let a = asView(Uint8Array, new Uint32Array)
a
D.TS
declare type ArrayBufferViewConstructor<T> = new (buffer: ArrayBufferLike, byteOffset?: number, byteLength?: number) => T;
declare function asView<V, C extends ArrayBufferViewConstructor<V>>(TypedArray: C, v: BufferSource, byteOffset?: number, byteLength?: number): V;
declare let a: unknown;
I expected a
is Uint8Array
, but got unknown
{
"compilerOptions": {
"strict": true,
"noImplicitAny": true,
"strictNullChecks": true,
"strictFunctionTypes": true,
"strictPropertyInitialization": true,
"strictBindCallApply": true,
"noImplicitThis": true,
"noImplicitReturns": true,
"alwaysStrict": true,
"esModuleInterop": true,
"declaration": true,
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"target": "ES2017",
"jsx": "react",
"module": "ESNext",
"moduleResolution": "node"
}
}
Playground Link: Provided
How do define the type make return type is Uint8Array
?
CodePudding user response:
Making use of the built-in InstanceType
, there is no need for the generic parameter V
. We just need to use it here, in the return type of the function:
): InstanceType<C> {