Javascript TypeName的条件类型给定错误

Javascript TypeName的条件类型给定错误,javascript,typescript,Javascript,Typescript,以下类型来自: 导出类型TypeName= “我没有把绳子伸出来吗?”字符串': “你的电话号码是多少?”编号': T扩展布尔值布尔': T扩展未定义?“未定义': T扩展函数?“函数': “对象”; 但是,尝试创建这样的函数会出现错误: export type TypeName<T> = T extends string ? 'string' : T extends number ? 'number' : T extends boolean ? 'boolean' :

以下类型来自:

导出类型TypeName=
“我没有把绳子伸出来吗?”字符串':
“你的电话号码是多少?”编号':
T扩展布尔值布尔':
T扩展未定义?“未定义':
T扩展函数?“函数':
“对象”;
但是,尝试创建这样的函数会出现错误:

export type TypeName<T> =
  T extends string ? 'string' :
  T extends number ? 'number' :
  T extends boolean ? 'boolean' :
  T extends undefined ? 'undefined' :
  T extends Function ? 'function' :
  'object';

function typeName<T>(t: T): TypeName<T> {
  return typeof t; // ERROR: type '"string"' is not assignable to type 'TypeName<T>'
}
导出类型TypeName=
“我没有把绳子伸出来吗?”字符串':
“你的电话号码是多少?”编号':
T扩展布尔值布尔':
T扩展未定义?“未定义':
T扩展函数?“函数':
“对象”;
函数类型名(t:t):类型名{
return typeof t;//错误:类型“string”不可分配给类型“TypeName”
}

原因是条件类型不遵循函数内的控制流

相关问题是:

e、 g.以下(来自上述问题)导致类似错误:

type SomeConditionalType<T> = T extends string ? 1 : -1;
function fn<T>(arg: T): SomeConditionalType<T> {
    if (typeof arg === "string") {
        return 1; // ERROR: not assignable to SomeConditionalType<T>
    } else {
        return -1; // ERROR: not assignable to SomeConditionalType<T>
    }
}
type SomeConditionalType=T扩展字符串?1 : -1;
函数fn(arg:T):SomeConditionalType{
如果(参数类型==“字符串”){
返回1;//错误:不可分配给SomeConditionalType
}否则{
return-1;//错误:不可分配给SomeConditionalType
}
}
变通办法 最简单的解决方法是在函数中使用类型断言,例如

export type TypeName<T> =
  T extends string ? 'string' :
  T extends number ? 'number' :
  T extends boolean ? 'boolean' :
  T extends undefined ? 'undefined' :
  T extends Function ? 'function' :
  'object';

function typeName<T>(t: T): TypeName<T> {
  return typeof t as TypeName<T>;
}
导出类型TypeName=
“我没有把绳子伸出来吗?”字符串':
“你的电话号码是多少?”编号':
T扩展布尔值布尔':
T扩展未定义?“未定义':
T扩展函数?“函数':
“对象”;
函数类型名(t:t):类型名{
返回typeof t作为TypeName;
}

原因是条件类型不遵循函数内的控制流

相关问题是:

e、 g.以下(来自上述问题)导致类似错误:

type SomeConditionalType<T> = T extends string ? 1 : -1;
function fn<T>(arg: T): SomeConditionalType<T> {
    if (typeof arg === "string") {
        return 1; // ERROR: not assignable to SomeConditionalType<T>
    } else {
        return -1; // ERROR: not assignable to SomeConditionalType<T>
    }
}
type SomeConditionalType=T扩展字符串?1 : -1;
函数fn(arg:T):SomeConditionalType{
如果(参数类型==“字符串”){
返回1;//错误:不可分配给SomeConditionalType
}否则{
return-1;//错误:不可分配给SomeConditionalType
}
}
变通办法 最简单的解决方法是在函数中使用类型断言,例如

export type TypeName<T> =
  T extends string ? 'string' :
  T extends number ? 'number' :
  T extends boolean ? 'boolean' :
  T extends undefined ? 'undefined' :
  T extends Function ? 'function' :
  'object';

function typeName<T>(t: T): TypeName<T> {
  return typeof t as TypeName<T>;
}
导出类型TypeName=
“我没有把绳子伸出来吗?”字符串':
“你的电话号码是多少?”编号':
T扩展布尔值布尔':
T扩展未定义?“未定义':
T扩展函数?“函数':
“对象”;
函数类型名(t:t):类型名{
返回typeof t作为TypeName;
}