Typescript 使用嵌套接口时,泛型类型丢失

Typescript 使用嵌套接口时,泛型类型丢失,typescript,Typescript,我在使用带有“嵌套”接口和ReadonlyArray的泛型时遇到问题。如何运行filterList函数而不丢失list参数的类型 interface INumber { value: number } interface IState { readonly numbers: ReadonlyArray<INumber> } var state: IState = { numbers: [{ value: 1 }, { value: 2 }, { value

我在使用带有“嵌套”接口和
ReadonlyArray
的泛型时遇到问题。如何运行
filterList
函数而不丢失
list
参数的类型

interface INumber {
    value: number
}

interface IState {
    readonly numbers: ReadonlyArray<INumber>
}

var state: IState = {
    numbers: [{ value: 1 }, { value: 2 }, { value: 3 }, { value: 4 }]
} 

function filterList<T>(list: T) {
    return list.filter(x => x.value > 2);
}

// Error: Property 'filter' does not exist on type 'T'.
const res = filterList(state.numbers);
处理这种情况的最佳做法是什么?
谢谢

你有几个选择
ReadonlyArray
Array
的一个子集,因此我们可以将
T
约束为具有以下值的对象的
ReadonlyArray

var state: IState = {
  numbers: [{ value: 1 }, { value: 2 }, { value: 3 }, { value: 4 }]
} 

function filterList<T extends ReadonlyArray<{value : number }>>(list: T){
  return list.filter(x => x.value > 2);
}

const res = filterList(state.numbers); // ok

var arr = [{ value: 1 }, { value: 2 }, { value: 3 }, { value: 4 }]
const res2 = filterList(arr); //ok
如果希望
filterList
保留传入的是只读数组还是常规数组,可以使用第一个版本并返回
T
,但需要使用类型断言将
filter
pe的结果键入
ReadonlyArray

function filterList<T extends ReadonlyArray<{value : number }>>(list: T): T{
  return list.filter(x => x.value > 2) as any;
}

const res = filterList(state.numbers); // ok, res is ReadonlyArray<INumber>

var arr = [{ value: 1 }, { value: 2 }, { value: 3 }, { value: 4 }]
const res2 = filterList(arr); //ok, res s { value: number; }[]
函数过滤器列表(列表:T):T{
返回list.filter(x=>x.value>2),如有;
}
const res=filterList(state.numbers);//好的,res是只读的
var arr=[{value:1},{value:2},{value:3},{value:4}]
const res2=过滤器列表(arr)//好的,res{value:number;}[]

谢谢,这非常有帮助。
function filterList<T extends {value : number }>(list: ReadonlyArray<T>){
  return list.filter(x => x.value > 2);
}
const res = filterList(state.numbers); // ok

var arr = [{ value: 1 }, { value: 2 }, { value: 3 }, { value: 4 }]
const res2 = filterList(arr); //ok
function filterList<T extends ReadonlyArray<{value : number }>>(list: T): T{
  return list.filter(x => x.value > 2) as any;
}

const res = filterList(state.numbers); // ok, res is ReadonlyArray<INumber>

var arr = [{ value: 1 }, { value: 2 }, { value: 3 }, { value: 4 }]
const res2 = filterList(arr); //ok, res s { value: number; }[]