演示代码:https://tsplay.dev/N5jo0m
interface Base {
name: string;
age: number;
};
interface FixedInstance extends Base {}
interface FollowInstance extends Base {}
type NameType = "fixed"|"follow";
type FixedName = "fixed";
type FollowName = "follow";
const data: NameType = 'fixed';
type myType = typeof data;
type isFixed = myType extends FixedName ? true : false; // true
type isFollow = myType extends FollowName ? true : false; // false
// -----------cut---
function sellect<T extends NameType, U = T extends FixedName ? FixedInstance : FollowInstance>(name: T, data: U) {
return {
name, data
};
}
const { name: myName, data: myData } = sellect("fixed", { name: "levi", age: 18 } as FollowInstance);
type dataType = typeof myData;
type dataisFixed = myType extends FixedName ? true : false; // true
type dataisFollow = myType extends FollowName ? true : false; // false
从cut
以上,可以看到都是正确的,问题在函数sellect
- 我需要根据第一个参数
name: T
去判断第二个参数data
的类型 - 提供的
name
是fixed
就限制data
是FixedInstance
,否则就限制为FollowInstance
问题1:我在sellect
参数传参的时候故意 as FollowInstance
,在TS中并没有报错
问题2:在拿到的结果中dataisFixed
是true
,但是我传过去的是FollowInstance
修改如下