如何验证打字稿中“未知”类型参数的属性?

k2s*_*n69 6 typescript

我确信这里有一些非常基本的东西,但我不太明白。这是我第一次深入研究该unknown类型,我使用它来验证用户配置文件。

我知道您必须基本上检查该未知类型的值才能获取打字稿以获取有关对象本身的越来越多的信息。这是我到目前为止所拥有的

function validateJsonOverride(override: unknown) {
  if (typeof override !== "object") {
    throw new Error("Property `overrides` must be an array of objects");
  }
  if (override == null) {
    throw new Error("Elements in `overrides` cannot be null or undefined");
  }
  
  if (!("a" in override)) {
    throw new Error("Property `a` is required for json overrides");
  }
  if (!("b" in override)) {
    throw new Error("Property `b` is required for json overrides");
  }
  const {a, b} = override;
  return {
    a,
    b,
  };

Run Code Online (Sandbox Code Playgroud)

但是现在const {a, b} = override;我在该行收到一个错误Property 'a' does not exist on type '{}'.ts(2339)

您应该如何澄清打字稿的类型,以便ab确实存在。

我还将其复制到Typescript Playground中以便于重播

k2s*_*n69 3

看起来这在 typescript@>5 中不再是问题。您可以编写以下代码,而无需Recordisas任何自定义打字稿实用程序类型 - Playground 链接

type Result = {
    a: string;
    b: number;
}

function validateJsonOverride(override: unknown): Result {
    if (typeof override !== "object") {
        throw new Error("Property `overrides` must be an array of objects");
    }
    if (override == null) {
        throw new Error("Elements in `overrides` cannot be null or undefined");
    }

    if (!("a" in override)) {
        throw new Error("Property `a` is required for json overrides");
    }
    if (!("b" in override)) {
        throw new Error("Property `b` is required for json overrides");
    }
    const { a, b } = override;
    if (typeof a !== "string") {
        throw new Error("Property `a` should be a string");
    }
    if (typeof b !== "number") {
        throw new Error("Property `b` should be a number");
    }

    return {
        a,
        b,
    };
}
Run Code Online (Sandbox Code Playgroud)