TypeScript泛型默认值、类型推导与递归类型适配咨询
问题解答
一、泛型自动推导的实现
你写的代码报错是因为显式指定Test类型时,泛型T会直接用默认值false,此时a的类型是false | undefined,自然不能赋值true。
不需要每次显式写Test<true>,可以用一个辅助函数让TypeScript自动推导泛型:
type Test<T extends boolean = false> = { a?: T; }; // 辅助函数,让TS自动推导泛型T function createTest<T extends boolean = false>(obj: Test<T>): Test<T> { return obj; } // 自动推导T为true const t1 = createTest({ a: true }); // 自动推导T为false(默认值) const t2 = createTest({}); const t3 = createTest({ a: false });
这样写就符合你要的「赋值true时T自动为true,不赋值/赋值false时用默认false」的逻辑。
二、递归类型的代码提示优化
原来的递归类型里,children固定用了默认泛型的RecursiveType<false>,导致子元素无法灵活指定isOK: true的情况,而且代码提示也不会根据isOK动态变化。
正确的做法是把RecursiveType定义成判别联合类型,让TypeScript通过isOK这个判别字段自动推断对应类型:
type RecursiveType = | { isOK: true; property: "a" | "b"; children?: Array<RecursiveType>; } | { isOK: false; property: 0; children?: Array<RecursiveType>; }; const recursive: RecursiveType = { isOK: true, property: 'a', children: [ { isOK: false, property: 0 }, { isOK: true, property: 'b' } ] };
这样写之后,VS Code会根据你输入的isOK值,自动提示对应的property可选值,子元素也可以自由选择isOK的true/false类型,完全符合需求。
内容的提问来源于stack exchange,提问作者CSSer
相关产品推荐
相关产品推荐

