已识别类型



我想从选项列表中获取默认选项。

type
export type Unpacked<T> = T extends Array<infer U> ? U : T;
interface
getDefaultValue?: <T extends Option[]>(options: T) => Unpacked<T>;

示例

const options = [
{label: "New York", value: 38 }, 
{label: "Washington", value: 39 }
]
then return type of getDefaultValue must be 38 | 39

错误的测试是

getDefaultValue={(options: Option[]) => any string}

但我有错误Type 'string' is not assignable to type 'Unpacked<T>'.

UPD

https://codesandbox.io/s/inspiring-galileo-ndto7l?file=/src/App.tsx

export type Unpacked<T> = T extends Array<infer U> ? U : T;
type Option = { label: string; id: number };
const getValues = <T extends Option[]>(anyOptions: T): Unpacked<T> => {
return anyOptions[0].id;
};
const options: Option[] = [
{ label: "New York", id: 38 },
{ label: "Washington", id: 39 }
];
/** result must be any id from options.*/
/** In current case type of result must be 38 | 39 */
const result = getValues(options);
export default function App() {
return null;
}

您需要使用不同的方法:

type Option = { label: string; id: number };
const getValues = <
Id extends number,
Item extends Option & { id: Id },
List extends Item[]
>(anyOptions: [...List]): List[number]['id'] => anyOptions[0].id;
// 38 | 39
const result = getValues([
{ label: "New York", id: 38 },
{ label: "Washington", id: 39 }
]);

游乐场

您需要推断id属性的文字类型。关于函数参数推断的更多信息,你可以在我的文章中找到

此外,如果您有一个数组,并且想要推断元素,则需要使用可变元组类型

最新更新