【问题标题】:variables type unknown not accessible typescript变量类型未知不可访问打字稿
【发布时间】:2020-11-27 12:50:31
【问题描述】:

如果我使用存储在unknown 类型变量中的一流函数会怎样。尝试这样做会出现以下编译器错误。

错误 TS2571:对象属于“未知”类型。

    let somethingany : unknown; 
    let somethingunknown : unknown;
    const loadUnkown: unknown  = (params: unknown) : unknown=>{  <--- exactly her is the mistake
        if(typeof params == 'string'){
            return params.trim();
        }
    }
    
    
    somethingany = loadUnkown('werwq'); <----//eror here
    console.log(somethingany.trim());
    
    somethingunknown = loadUnkown('werwer');  <----//eror here
    if(typeof somethingunknown == 'string'){
        console.log(somethingunknown.trim());
    }

虽然any 工作正常。

let somethingany : any;
let somethingunknown : any;
const loadString: any = (params: any): any =>{
    return params;
}

somethingany = loadString('asdasdsad');
console.log(somethingany.trim());

somethingunknown = loadString('asdasdsad');
if(typeof somethingunknown == 'string'){
    console.log(somethingunknown.trim());
}

需要知道为什么const loadUnkown: unknown = ()=&gt;{} 是个问题

【问题讨论】:

  • 不,没有帮助不寻找任何与未知之间的区别。需要知道为什么 const loadUnkown: unknown 是个问题
  • 因为 unknown 是不可调用的。试试if(typeof loadUnkown === "function") { loadUnknown("string");}
  • @kevinSpaceyIsKeyserSöze 你能解释一下吗
  • 您已经链接了答案,但又在这里 :) 'unknown' vs. 'any'

标签: javascript typescript types


【解决方案1】:

这里的要求是我的回答。您的问题没有多大意义,因为如果您删除 unknown,变量 foo 在您的示例中已经有一个类型(类型:(params: unknown) =&gt; unknown)。但我认为这只是为了演示。

如果您将函数 foo 定义为未知,则打字稿编译器不知道 foo 具有哪种类型。

这样做的好处是,使用此变量的人必须在 typescript 编译器允许他通过之前进行类型检查

const foo: unknown = (params: unknown): unknown => {
    return null;
}
// not working -> the typescript compiler says:
// This expression is not callable.
// Type '{}' has no call signatures.
foo('werwq');

所以使用该变量的人必须先进行类型检查,然后打字稿编译器让变量的用户将其用作函数。

if (typeof foo === "function") {
    foo('werwq');
}
// or even
switch (typeof foo) {
    case "function":
        foo("a");
}

【讨论】:

  • 使这个未知类型适用于变量,所以它需要类型检查?
猜你喜欢
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-24
  • 1970-01-01
  • 2018-02-02
  • 2022-01-01
相关资源
最近更新 更多