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; }[]