主要问题是 TypedArrays 是声明为的接口
{
T: typeof typedArrays[T];
}
所以input被输入为"T",但是"T"不能分配给keyof typeof typedArray
从上面的响应来看,输入更好的 TypedArrays 是正确的,但你甚至可以不使用它:
const typedArrays = {
int8: Int8Array,
uint8: Uint8Array,
int16: Int16Array,
uint16: Uint16Array,
int32: Int32Array,
uint32: Uint32Array,
uint64: BigUint64Array,
int64: BigInt64Array,
float32: Float32Array,
float64: Float64Array,
};
function doSomething<T extends keyof typeof typedArrays>(
input: T
): typeof typedArrays[T] {
return typedArrays[input];
}
const a = doSomething("int8"); // Int8ArrayConstructor
const b = doSomething("float32"); // Float32ArrayConstructor
另外,请留意new的使用。
以typedArrays中的int8: Int8Array为例,记住Int8Array不是类型,而是var:
var Int8Array: Int8ArrayConstructor
所以这会导致错误:
function doSomething<T extends keyof TypedArray>(input: T): TypedArray[T] {
return new typedArrays[input]; // Error
}
这是因为我们从一个应该返回 Int8ArrayConstructor 的函数返回一个真正的 Int8Array。
为了避免这种情况,请执行以下操作:
const typedArrays = {
int8: Int8Array,
uint8: Uint8Array,
int16: Int16Array,
uint16: Uint16Array,
int32: Int32Array,
uint32: Uint32Array,
uint64: BigUint64Array,
int64: BigInt64Array,
float32: Float32Array,
float64: Float64Array,
};
type TypedArray = typeof typedArrays;
function doSomething<T extends keyof TypedArray>(input: T): TypedArray[T] {
return typedArrays[input];
}
const a = new (doSomething("int8"))(); // Int8Array
const b = doSomething("float32"); // Float32ArrayConstructor