Typescript:重写库中的属性类型-出现错误,后续属性声明必须具有相同的类型

enyaitl3  于 2023-01-03  发布在  TypeScript
关注(0)|答案(2)|浏览(225)

我想覆盖库声明中的属性类型,我尝试使用接口进行覆盖,但出现错误Subsequent property declarations must have the same type。我应该如何解决此问题?

// this is library declaration
declare class Auth {
    user: Record<string, string | number> | null 
    // i want to remove null type in user property, because i dont want to use `non-null assertion` in line 21
    // i cant change this file because it is 3rd party library
}

// ------------------------------

// our file

// my override interface, but fail
interface Auth {
    user: Record<string, string | number>
}

const a: Auth = {
    user: {
        name: 'joko',
        age: 30
    }
}

const userName = a.user!.name
// const userName = a.user.name // <-- i want use like this, because i'm sure that this property is always available

我尝试过用接口覆盖库声明,但是失败了。我预期的结果是,只使用我们的代码,就可以覆盖该类型,而无需触及或更改库。

yrdbyhpb

yrdbyhpb1#

嗨@巴加斯卡拉,

你为什么不这样做。
接口来扩展Auth类并重写用户属性的类型。

interface MyAuth extends Auth {
    user: Record<string, string | number>
}

在你的档案里:-

const a: MyAuth = {
    user: {
        name: 'joko',
        age: 30
    }
}

如果要重写已在库中声明的变量,可以通过在代码中声明一个同名的新变量来实现。
注意这不是库文件.它是你的代码文件.
在你的代码文件里。

const userName = a.user.name;

因此,将使用代码中声明的const userName = a.user.name;,而不是库中的const userName = a.user!.name;

jjhzyzn0

jjhzyzn02#

我自己已经解决了,在我的例子中,我想覆盖nuxt-auth模块上的Auth接口,解决方案如下:
1.将node_modules中的模块类型复制到我们的类型文件中。然后更改相应的接口(将Auth更改为IAuth)。IAuth是我们修改后的接口。

import { IAuth } from '~/interface/auth/model';

export * from '@nuxtjs/auth-next/dist';

declare module 'vue/types/vue' {
  interface Vue {
    $auth: IAuth;
  }
}

// rest of the file

1.在tsconfig.json中添加上面的paths文件,这样typescript将使用该文件而不是原始模块类型。

"compilerOptions": {
// ...
"paths": {
    "@nuxtjs/auth-next": [
        "types/nuxt-auth.d.ts"
      ],
    // ...  
   }
// ...
}

瞧,使用修改后的接口,该类型按预期运行

相关问题