简体   繁体   English

Function 分配函数时未正确检查参数类型

[英]Function argument types are not properly check when assigning functions

I ran into a weird interaction in TypeScript:我在 TypeScript 遇到了一个奇怪的交互:

type Vector2 = { x: number; y: number };
type Vector3 = { x: number; y: number; z: number };

type Takes2 = (vec: Vector2) => void;
type Takes3 = (vec: Vector3) => void;

let f2: Takes2 = (vec) => console.log(vec.x + vec.y);
let f3: Takes3 = (vec) => console.log(vec.x + vec.y + vec.z);

// This makes sence - we call f2 with Vector3, so the "z" prop is going to be ignored
f3 = f2;
f3({ x: 1, y: 2, z: 5 }); // prints 3 (1 + 2)

// This makes no sence - we call f3 with Vector2, so we read undefined when we read vec.z
f2 = f3;
f2({ x: 1, y: 2 }); // prints NaN! (1 + 2 + undefined)

It looks like when one function is assigned to another variable (or passed as an argument I guess), TypeScript only checks if the types are "one way compatible" (one of the arguments can be assigned to the other), but doesn't bother checking if the direction in which the argument types are compatible in matches with the direction of the function assignment.看起来当一个 function 被分配给另一个变量(或者我猜是作为参数传递)时,TypeScript 只检查类型是否“单向兼容”(arguments 中的一个可以分配给另一个),但不会麻烦检查参数类型兼容的方向是否与 function 分配的方向相匹配。

Is it always like this?总是这样吗? Or is a compiler option that can be toggled?还是可以切换的编译器选项?

TypeScript version: 4.4.4 tsconfig.json: TypeScript 版本:4.4.4 tsconfig.json:

{
  "compilerOptions": {
    "target": "es5",
    "downlevelIteration": true,
    "lib": ["dom", "dom.iterable", "esnext"],
    "allowJs": true,
    "skipLibCheck": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    // "strict": true,
    "forceConsistentCasingInFileNames": true,
    "noImplicitAny": true,
    "noImplicitReturns": true,
    "noFallthroughCasesInSwitch": true,
    "module": "esnext",
    // "module": "commonjs",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    // "isolatedModules": true,
    "noEmit": true,
    "jsx": "react",
    "baseUrl": ".",
    "paths": {
      "*": ["./src/*"]
    }
  },
  "types": ["forge-viewer"],
  "include": ["src"]
}

The flag you are looking for is strictFunctionTypes .您正在寻找的标志是strictFunctionTypes

I noted in your config that you've commented out "strict": true .我在您的配置中注意到您已注释掉"strict": true Had you left strict mode on (this is recommended), then strictFunctionTypes would have been included and you'd have gotten a compile error.如果你离开严格模式(这是推荐的),那么strictFunctionTypes就会被包含进来,你就会得到一个编译错误。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM