Typescript 类型为'的参数;字符串|未定义';不可分配给类型为'&引用;无标题空|未定义';
我不能理解TypeScript的类型推断。我认为这应该是有效的,不需要我指定Typescript 类型为'的参数;字符串|未定义';不可分配给类型为'&引用;无标题空|未定义';,typescript,type-inference,Typescript,Type Inference,我不能理解TypeScript的类型推断。我认为这应该是有效的,不需要我指定t的类型: export const deflt = <T>(val: (T | undefined | null), defaultVal: T): T => { if (val === undefined || val === null) { return defaultVal; } return val; } function maybeLabelName(name: str
t
的类型:
export const deflt = <T>(val: (T | undefined | null), defaultVal: T): T => {
if (val === undefined || val === null) {
return defaultVal;
}
return val;
}
function maybeLabelName(name: string | undefined) {
return deflt(name, 'untitled');
}
我可以通过将deflt
调用更改为以下选项之一来修复它:
// Option 1:
return deflt<string>(name, 'untitled');
// Option 2:
const s: string = 'untitled';
return deflt(name, s);
//选项1:
返回deflt(名称“untitled”);
//备选案文2:
常量s:string='untitled';
返回deflt(名称,s);
TypeScript不应该自动推断
字符串
类型吗?我认为在这种情况下,TypeScript推断t
的方式有点奇怪。由于您指定常量'untitled'
,编译器将推断T
为字符串文字类型'untitled'
,因为这是推断T
的最简单的站点。然后,它将对照字符串文本类型检查另一个参数,并发现string
不可分配给“untitled”
。解决方法是在推断T
时,通过添加与{}
的额外交点来降低第二个参数的优先级:
export const deflt = <T>(val: (T | undefined | null), defaultVal: T & {} ): T => {
if (val === undefined || val === null) {
return defaultVal;
}
return val;
}
function maybeLabelName(name: string | undefined) {
return deflt(name, 'untitled'); // T is string now
}
使用泛型时,可以有两种不同的方法“泛化”参数 以您的案例为例:
const deflt=(val:(T | undefined | null),defaultVal:T):T
如果您使用:deflt(a,b)
,那么您将强制a
为string |未定义| null
,b
为string
如果使用:deflt(a:string,b:untitled”)
,则传输程序将“untitled”
理解为常量,而不是字符串。因此,b
将属于类型“无标题”
,从而使T
属于类型“无标题”
。当您使用类型为string
的a
时,编译器无法将string
强制转换为“untitled”
解决方案已由提供。您已将deflt声明为通用函数,但已将其用作常规函数
const deflt = <T>(val: (T | undefined | null), defaultVal: T): T => {
if (val === undefined || val === null) {
return defaultVal;
}
return val;
}
function maybeLabelName(name?: string) {
return deflt<typeof name>(name, 'untitled');
}
const deflt=(val:(T | undefined | null),defaultVal:T):T=>{
如果(val==未定义| | val==空){
返回defaultVal;
}
返回val;
}
函数名称(名称?:字符串){
返回deflt(名称“untitled”);
}
你使用什么版本的TypeScript?@finico你可以在最新的TS中复制,你只需要StrictNullckeks
就可以了。我使用的是TypeScript 3.1.6。这感觉就像一个bug。@Nurpax你可以将它发布到GitHub。。但这也推断出字符串文本类型export const deflt=(val:T):T=>{return val;}deflt('untitled');/T是“无标题的”
不可否认,这确实让我觉得是违反直觉和相当奇怪的行为。你认为这是值得一提的,还是仅仅是“按设计工作”?编辑:太慢:)我认为TypeScript不需要我为泛型函数指定类型参数。类型推断应该处理这个问题。请参阅例如,“注意,我们不必显式地在尖括号()中传递类型;编译器只需查看值“myString”,并将t设置为其类型。”是的,这是一个非常好的错误,在针对TypeScript提交错误时发现了两个类似的错误,并决定不提交新的错误。谢谢你的链接!
function maybeLabelName(name: string | undefined) {
return deflt(name, 'untitled' as string); // T is string now
}
const deflt = <T>(val: (T | undefined | null), defaultVal: T): T => {
if (val === undefined || val === null) {
return defaultVal;
}
return val;
}
function maybeLabelName(name?: string) {
return deflt<typeof name>(name, 'untitled');
}