TypeScript에서 입력하지 않음

never 중국어 정의와 같이 TypeScript의 never유형은 값이 발생하지 않는 유형을 나타냅니다. 예:

type A = 'A';
type B = 'B';
type C = A & B;
复制代码

공용체 유형 CA유형과 유형 B의 유형 값이 A및 와 동일함을 의미합니다 B. 이러한 유형의 정의를 Union Type이라고 하며 TypeScript에서 지원하지만 이 예제를 작성하면 type CA와 같으면서 동시에 B불가능한 조건이므로 여기서 type Cnevertype 입니다. .

유형 정보는 요소의 집합으로 간주될 수 있으며, 유형 A은 집합과 동일하고 {'A'}, 유형 B은 집합과 동일하고 , 유형은 집합과 동일하고 , {'B'}유형 C은 빈 집합에 해당합니다.{}never

neverType은 함수의 반환 유형을 선언하는 데 사용할 수 있으며, 이는 함수에 반환 값이 없음을 나타냅니다.

function a(): never {
  throw new Error('error');
}
复制代码

当然,void 类型也可以用于声明函数的返回值类型来表示函数没有任何返回值,但是 void 所表示的意思就不那么明确了。使用 void 的话,函数是可以返回 undefined 的,而采用 never 则不允许函数返回 undefined

function a(): void {
  return undefined; // 一切正常
}

function b(): never {
  return undefined; // 类型 'undefined' 不能分配给类型 'never'
}
复制代码

使用函数表达式创建的无返回值的函数在不指定函数返回值类型时,TypeScript 将自动推断其返回值类型为 never 类型。

但是,上述情况中如果采用函数声明创建函数,其返回值类型将会被推断为 void 类型。

这并非是 TypeScript 的 bug,之所以设计成这样是出于对向后兼容的考虑。现存的很多库中有大量抽象函数定义的返回值类型信息并没有明确指定为 void。由于这些函数是抽象的(抽象函数仅有类型信息,无函数功能实现),函数的具体实现交给了库使用者,使用者在实现过程中可自由决定函数是否有返回值。如果这种情况下函数类型被 TypeScript 推断为 never,则表示函数实现不能有返回值(函数实现中不可出现 return 关键字),很显然这样就出现了冲突,导致函数的实现无法被正确重写。

class AbstractClass {
    methodToBeOverriden() { // TypeScript 推断其返回类型为 void
        throw new Error('Not implemented!');
    }
}
复制代码

因此,在实际项目开发中,不能完全依赖于 TypeScript 的类型推断系统来帮助我们生成正确的类型信息。当需要明确表明函数无返回值时,需要将其返回值类型指定为 never

如果发现译文存在错误或其他需要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可获得相应奖励积分。文章开头的 本文永久链接 即为本文在 GitHub 上的 MarkDown 链接。


너겟 번역 프로젝트 는 고품질의 인터넷 기술 기사를 번역하는 커뮤니티이며, 기사의 출처 너겟에 대한 영어 공유 기사입니다. 콘텐츠는 Android , iOS , 프론트엔드 , 백엔드 , 블록체인 , 제품 , 디자인 , 인공 지능 및 기타 분야를 다루고 있습니다.더 높은 품질의 번역을 보고 싶다면 Nuggets 주세요 . 웨이보 , 지후 칼럼 .

추천

출처juejin.im/post/7079083161262653470